Определите, сколько времени занимает загрузка файла (PHP) - PullRequest
5 голосов
/ 28 мая 2010

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

Ответы [ 6 ]

8 голосов
/ 28 мая 2010

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

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

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

6 голосов
/ 18 ноября 2011

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

  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';

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

2 голосов
/ 18 ноября 2011

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

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

1 голос
/ 18 ноября 2011

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

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

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

<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 МБ.

0 голосов
/ 21 ноября 2012

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

0 голосов
/ 18 ноября 2011

Я имею в виду простую логику

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

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

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

...