2009-10-29 2 views
2

Есть ли способ зарегистрировать (записать) время, необходимое для загрузки файла с веб-сервера через браузер? Файл записан на HDD, а среда - LAMP.файл времени загрузки файла

Спасибо.

ответ

1

Конечно, есть. Вы должны либо использовать mod_rewrite, чтобы Apache знать файл должен быть подан PHP (попросить больше инструкций, если это ваш случай) или просто использовать PHP скрипт для извлечения файла, как это:

http://youserver.com/download.php?filename=mypicture.jpeg

и тогда вы можете можете иметь download.php так:

<?php 
// gets the starting time 
$time_start = microtime(true); 

// WATCHOUT! THIS IS NOT SECURE! EXAMPLE ONLY. 
#$filename = $_GET['filename']; 

// gets the intro.mp3 file and outputs it to the user 
$filename = "intro.mp3"; 
header('Content-type: audio/mpeg'); 
header('Content-Length: '.filesize($filename)); 
header('Content-Disposition: attachment; filename="intro.mp3"'); 
readfile($filename); 

// gets the end time and duration 
$time_end = microtime(true); 

// write time to hdd, database, whatever 
// ... 
error_log("Processing time: ". sprintf("%.4f", ($time_end-$time_start))." seconds"); 
?> 

Пожалуйста, помните, что $filename = $_GET['filename'] только пример, и должен быть надлежащим образом спасся, так что люди не могут взломать ваш сервер.

EDIT:
Измененный, чтобы проверить, если он действительно работал - Марк сделал меня вопрос это! ;) Требуется незначительная настройка (особенно в микро-время), но да, это работает!

+1

Действительно ли это работает? Я подумал, что настанет время, пока не дойдет до этого сценария ... почему он дождался завершения отправки файла? – mpen

+0

Я должен был сделать только некоторые настройки, и приведенный выше код был доказательством концепции, но да, он регистрирует используемое время. PHP является синхронным и поэтому должен ждать, пока readfile() будет продолжать свою жизнь. – Frankie

+0

PHP может быть синхронным, поскольку он ждет, пока не будет выполнено readfile(), но это ничего не говорит о остальной части стека. Apache может очень хорошо (и, скорее всего, делает) принять полный файл в RAM-память сервера и отправить его медленно до тех пор, пока readfile(), и ваш скрипт не завершится ... – Wim

0

Один из способов заключается в прокси-загрузке с помощью скрипта (может быть легко достигнуто с помощью mod_rewrite). Это означает, что вам необходимо выполнить всю работу, например, расширение отображения в соответствующие типы mime (для заголовка Content-Type). Попробуйте загрузить файл из своего браузера и взгляните на заголовки, которые он отправляет; вам нужно имитировать их. Вы можете использовать, например. web -sniffer.net для проверки заголовков.

+0

Автору вопроса - теперь, вероятно, AWOL - этот ответ также замечателен, потому что, если вы планируете делать это по нескольким типам файлов, вам нужно будет проверить их типы mime и соответствующим образом адаптировать их. – Frankie

0

Я не думаю, что PHP будет иметь доступ к этой информации. Я не уверен, что Apache сообщит вам об этом, или будет ли приведенный ниже метод также время до тех пор, пока файл не будет сброшен в буфер передачи, но я бы предложил вам попробовать следующее:

Определите пользовательский журнал, в котором вы включить директиву «% D», это дает вам «Время, затраченное на выполнение запроса в микросекундах».

Смежные вопросы