2010-02-27 3 views
2

Что является лучшим способом, чтобы увидеть, сколько времени требуется для вашего PHP скрипт для запуска?Лучший способ раз, когда PHP скрипт

Я думал, что-то вроде этого:

$start_time = time(); //this at the beginning 
$end_time = time(); //this at the end 
echo = $end_time-$start_time; 

Но как я могу сделать это в то, что читается мне и иметь смысл для меня?

ответ

5

Если вы хотите какой-либо дальнейшей детализации в вашем времени, чем секунд, вы должны будете использовать microtime() (Возвращает текущую метку времени Unix с микросекунд)

<?php 
$time_start = microtime(true); 

// Sleep for a while 
usleep(100); 

$time_end = microtime(true); 
$time = $time_end - $time_start; 

echo "Did nothing in $time seconds\n"; 
?> 

** Ниже был добавлен позже **

Что касается дальнейшего форматирования этого результата:

Ну, в зависимости от того, что вы делаете, вы, как правило, не имеют сценарии, идущие мимо минуту. У вас определенно не должно быть ничего больше часа. (Если вы делаете, вы должны спросить себя, что вы делаете с вашей жизнью)

Имея это в виду, все, что вам нужно, это простые расчеты:

$tmp = floor($time); 
$minutes = $tmp/60; 
$seconds = ($tmp % 60) + ($time - $tmp); 

$output = 'Script took '; 
if ($minutes > 0) $output .= $minutes . ' minutes and '; 
$output .= $seconds . ' seconds to complete.'; 
echo $output; 

(Это не испытанные, и возможно, будет оптимизирован, но должен начать вас в правильном направлении)

+0

Предложения о том, как сделать этот человек доступным для чтения? AKA Мне бы хотелось, чтобы он сказал что-то вроде того, что потребовалось 1 минута 34 секунды и 54 микросекунда и так далее. Даже не знаю, что/как мы должны его хранить ... –

+0

@Adam, ознакомьтесь с моими дополнениями к моему ответу –

3

Я хотел бы использовать вместо microtime(TRUE). Это даст вам лучшие результаты с разрешением микросекунды. Также есть PECL APD extension, который обрабатывает скрипты.

Расширение немного на APD, предполагая, что один установил APD, вам просто нужно добавить строку

apd_set_pprof_trace(); 

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

Real   User  System    secs/ cumm 
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name 
-------------------------------------------------------------------------------------- 
100.0 0.00 0.00 0.00 0.00 0.00 0.00  1 0.0000 0.0009   0 main 
56.9 0.00 0.00 0.00 0.00 0.00 0.00  1 0.0005 0.0005   0 apd_set_pprof_trace 
28.0 0.00 0.00 0.00 0.00 0.00 0.00 10 0.0000 0.0000   0 preg_replace 

Пример вывода от РНР руководства.

Я лично считаю APD чрезвычайно полезным и использовать его довольно часто в сильно пострадавших сценариев.

+1

+1 для PECL APD! Отличный ответ! –

+0

[Пример использования] [1] из [apd_set_pprof_trace()] [2], кажется, дает наиболее правильный ответ на этот вопрос. [1]: http://php.net/manual/en/apd.examples.usage.php [2]: http://us.php.net/manual/en/apd.examples.usage. php –

+0

Это потрясающе. Благодаря! –

1

Это сценарий, доступный в Интернете (то есть http://www.yoursite.com/BLA.php) или скрипт, который вы используете в командной строке? Если это командная строка сценария, вы можете использовать команду времени:

time php FILE.php 

В противном случае, микропоры, вероятно, ваш лучший выбор.

1

Я нахожу этот класс, чтобы быть полезным для времени сценарии, microtime оказываются друг в том, что:

class timer 
{ 
    private $start_time = NULL; 
    private $end_time = NULL; 

    private function getmicrotime() 
    { 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
    } 

    function start() 
    { 
    $this->start_time = $this->getmicrotime(); 
    } 

    function stop() 
    { 
    $this->end_time = $this->getmicrotime(); 
    } 

    function result() 
    { 
    if (is_null($this->start_time)) 
    { 
    exit('Timer: start method not called !'); 
    return false; 
    } 
    else if (is_null($this->end_time)) 
    { 
    exit('Timer: stop method not called !'); 
    return false; 
    } 

    return round(($this->end_time - $this->start_time), 4); 
    } 

    # an alias of result function 
    function time() 
    { 
    $this->result(); 
    } 

} 
2

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

Если вы серьезно относитесь к тому, чтобы найти ответ на последний вопрос, тогда установите xdebug, и вы получите бонусы, чтобы не называть подобных microtime(), которые сами замедляют ваш скрипт.

http://xdebug.org/docs/profiler

http://xdebug.org/docs/

+0

Ницца Мне нужно будет изучить это ... спасибо! –

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