Как отслеживать загрузку файлов

#php #apache #logging #download #analytics

Вопрос:

У меня есть веб-сайт, который воспроизводит mp3-файлы во флэш-плеере. Если пользователь нажимает «воспроизвести», flash-плеер автоматически загружает mp3-файл и начинает его воспроизведение.

Есть ли простой способ отследить, сколько раз был загружен конкретный клип песни (или любой двоичный файл)?


Является ли ссылка на воспроизведение ссылкой на фактический mp3-файл или на какой-либо код javascript, который открывает проигрыватель?

Если последнее, вы можете легко добавить туда свой собственный код регистрации, чтобы отслеживать количество обращений к нему.

Если первое, вам понадобится что-то, что может отслеживать сам журнал веб-сервера и проводить это различие. Мой план хостинга поставляется с Webalizer, который прекрасно это делает.

Это код javascript, который отвечает на этот вопрос.

Однако было бы неплохо знать, как отслеживать загрузки с помощью другого метода (без переключения хостов).

Ответ №1:

Самое смешное, что я написал медиа-галерею php для всех своих музыкальных произведений 2 дня назад. У меня была похожая проблема. Я использую http://musicplayer.sourceforge.net/ для игрока. И плейлист построен с помощью php. Все музыкальные запросы отправляются в скрипт под названием xfer.php?файл=ЧТО УГОДНО

 $filename = base64_url_decode($_REQUEST['file']);
header("Cache-Control: public");
header('Content-disposition: attachment; filename='.basename($filename));
header("Content-Transfer-Encoding: binary");
header('Content-Length: '. filesize($filename));

//  Put either file counting code here, either a db or static files
//
readfile($filename);  //and spit the user the file

function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_,', ' /='));
}
 

И когда вы вызываете файлы, используйте что-то вроде:

 function base64_url_encode($input) {
     return strtr(base64_encode($input), ' /=', '-_,');
}
 

http://us.php.net/manual/en/function.base64-encode.php

Если вы используете какой-либо JavaScript или flash-плеер (например, JW-плеер), для которого требуется фактическая ссылка на mp3-файл или что-то еще, вы можете добавить текст «amp;type=.mp3», чтобы окончательная ссылка выглядела примерно так: «www.example.com/xfer.php?file=34842ffjfjxfhamp;type=.mp3». Таким образом, похоже, что он заканчивается расширением mp3, не затрагивая ссылку на файл.

Комментарии:

1. в этом сценарии есть уязвимость для обхода каталогов! Злоумышленник может передать xfer.php?файл=../../../passwd или что-то еще, что он хочет! Будь осторожен!!!

2. это увеличит лимиты памяти сервера, если файлы будут слишком большими, а ваш трафик высоким.. что-то, что я испытал сам.

3. как исправить «уязвимость обхода каталогов» ?

4. @anarchOi: Самый простой способ-сравнить параметр GET ( $_REQUEST['file'] ) с белым списком известных хороших имен файлов. Например, список всех файлов в каталоге, в котором вы храните свои файлы. Убедитесь, что вы используете этот каталог только для хранения файлов, которые хотите загрузить…

5. @tmsimont, Вы нашли какие-либо способы снижения потребления памяти?

Ответ №2:

Используйте свои файлы журнала httpd. Установить http://awstats.sourceforge.net/

Ответ №3:

Используйте bash:

 grep mp3 /var/log/httpd/access_log | wc
 

Комментарии:

1. в этом методе есть по крайней мере 2 недостатка: он подсчитывает запросы GET и HEAD и подсчитывает все коды ответов HTTP. Например, может быть много 206 ответов, которые приведут вас к завышенной оценке загрузок.

Ответ №4:

Если ваша песня / двоичный файл обслуживался apache, вы можете легко просмотреть журнал доступа, чтобы узнать количество загрузок. Простой скрипт post-logrotate может обрабатывать журналы и сохранять статистику подсчета в базе данных. Это имеет преимущество в производительности, так как не находится в вашем пути кода запроса в реальном времени. Делать некритичные вещи, такие как статистика в автономном режиме,-хорошая идея для масштабирования вашего сайта для большого числа пользователей.

Ответ №5:

Вы даже можете настроить директиву Apache .htaccess, которая преобразует запросы *.mp3 в строку запроса, с которой работает dubayou. Это может быть элегантный способ сохранить прямой запрос и при этом иметь возможность включить функцию регистрации потока в ответ.

Ответ №6:

Является ли ссылка на воспроизведение ссылкой на фактический mp3-файл или на какой-либо код javascript, который открывает проигрыватель?

Если последнее, вы можете легко добавить туда свой собственный код регистрации, чтобы отслеживать количество обращений к нему.

Если первое, вам понадобится что-то, что может отслеживать сам журнал веб-сервера и проводить это различие. Мой план хостинга поставляется с webalizer, который прекрасно это делает.

Ответ №7:

Есть ли база данных для вашей музыкальной библиотеки? Если есть какой-либо серверный код, который запускается при загрузке mp3, вы можете добавить туда дополнительный код, чтобы увеличить количество воспроизведения. Вы также можете попросить javascript сделать второй запрос на увеличение количества воспроизведения, но это может привести к ложному увеличению количества людей/роботов.

Раньше я работал на сайте интернет-радио, и мы использовали отдельные таблицы для отслеживания времени воспроизведения каждой песни. Наши потоки были основаны на скрипте perl под управлением icecast, поэтому мы запускали запрос к базе данных каждый раз, когда начинался новый трек. Затем, чтобы вычислить количество воспроизведений, мы запустили бы запрос, чтобы подсчитать, сколько раз идентификатор песни был в журнале воспроизведения.

Ответ №8:

Проблема, с которой я сталкивался с такими вещами, как AWStats / чтение журналов веб-сервера, заключается в том, что большие загрузки часто могут быть разделены на фрагменты данных в журналах. Это затрудняет согласование точного количества загрузок.

Я бы предложил отслеживать события Google Analytics, так как это будет регистрироваться один раз за клик по ссылке для загрузки.