Определите, сколько времени требуется для загрузки файла (PHP)

Возможно ли узнать (serveride) время, необходимое для загрузки файла? У меня есть API загрузки изображений, и в моем ответе я хотел бы вернуть время загрузки (не включая время выполнения скрипта).

Solutions Collecting From Web of "Определите, сколько времени требуется для загрузки файла (PHP)"

Я думаю, что есть переменная $_SERVER['REQUEST_TIME'] которая указывает начало HTTP-запроса, поэтому в самом начале вашего скрипта:

 $upload_time = time() - $_SERVER['REQUEST_TIME']; 

Результат будет в секундах.

Кажется, этот метод работает довольно нормально:

  1. Отправляйте запрос ajax (прямо перед сообщениями формы) на сервер, который хранит временную метку сеанса
  2. Опубликовать форму
  3. Проверьте разницу в принимающей стороне 🙂

HTML

 <?php session_start(); // must be at the top ?> <form id="upload-form" enctype="multipart/form-data" method="post"> <input type="file" name="datafile" size="40"> <input type="submit" value="Send"> </form> <script type="text/javascript"> $(function() { $('#upload-form').submit(function() { $.ajax({ url: 'start-timer.php', type: 'POST', context: this, success: function() { this.submit(); }, }); return false; }); }); </script> 

пуско-timer.php

 <?php session_start(); $_SESSION['time'] = microtime(true); 

upload.php

 <?php session_start(); header('content-type: text/plain; charset=utf-8'); if( ! isset($_FILES['file']) || ! isset($_SESSION['time']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK || ! is_uploaded_file($_FILES['file']['tmp_name'])) { exit('stuff went wrong...'); } $time = microtime(true) - $_SESSION['time']; unset($_SESSION['time']); echo round($time, 3).'s'; с <?php session_start(); header('content-type: text/plain; charset=utf-8'); if( ! isset($_FILES['file']) || ! isset($_SESSION['time']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK || ! is_uploaded_file($_FILES['file']['tmp_name'])) { exit('stuff went wrong...'); } $time = microtime(true) - $_SESSION['time']; unset($_SESSION['time']); echo round($time, 3).'s'; 

Рабочий образец: http://samples.geekality.net/upload-timer

Вы просто не можете измерить что-либо внутри сценария получения.
Просто потому, что он запускается сразу после завершения загрузки (обрабатывается веб-сервером).

Таким образом, как сказал Свиш, вызов и временная метка AJAX в сеансе были бы самым простым решением.

Посмотрите на ссылку.

http://prefetch.net/blog/index.php/2007/01/02/measuring-apache-request-processing-time/

Он показывает, как настроить apache для регистрации времени, которое запрос получает apache.

Затем вы можете использовать фонд apache_request_headers в PHP и извлечь это время.

http://php.net/manual/en/function.apache-request-headers.php

Возможно, таким образом вы можете выяснить время между тем, когда apache начинает получать файл, и когда он передает обработку на php?

Возможно, вам нужно провести некоторое тестирование, поскольку я этого не пробовал. Дайте мне знать, если это сработает … 🙂

ОБНОВЛЕНИЕ @GustavBertram :

Примечание. Я отредактировал ответ вместо моего собственного вопроса, так как я хочу документировать попытку отдельно для каждого ответа.

Я включил mod_headers в Apache и добавил следующий файл конфигурации:

 #/etc/apache2/mods-available/headers.conf RequestHeader set X-Request-Received: %t и #/etc/apache2/mods-available/headers.conf RequestHeader set X-Request-Received: %t 

Затем я обновил свой сценарий:

 <form action="#" enctype="multipart/form-data" method="post"> Upload:<input type="file" name="datafile" size="40"> <input type="submit" value="Send"> </form> <?php // Get the request headers $REQUEST_HEADERS = apache_request_headers(); // Extract $t value from header parse_str($REQUEST_HEADERS['X-Request-Received']); // Massage string to get float in seconds $received_time = substr_replace($t, '.', 10, 0); // Get the current microtime as float in seconds $current_time = microtime(1); $upload_time = $current_time - $received_time; echo $received_time . " \n <BR />"; echo $current_time . " \n <BR />"; echo $upload_time; 

Я тестировал его как на локальной машине, так и на удаленной машине в сети, с файлом 700 МБ.

В Apache 2.2.22 и PHP 5.2.17 я использую apache_response_headers () с командой flush (), иначе это не сработает, я получаю заголовок с одной переменной. ob_end_flush () не помог мне. REQUEST_TIME переменной $ _SSERVER является элегантным эквивалентом, но обратите внимание, что это работает с PHP 5.1.

У меня простая логика

когда изображение загружается для загрузки

сохранить начальное время в переменной и установить другую переменную, например, uploadStatus = 0, затем при загрузке установите переменную uploadStatus = 1, а также сохраните время окончания в другой переменной.

При загрузке установите флажок uploadStatus == 1, а затем вычитайте время начала с конца, и вы получите время загрузки.