Отслеживание времени выполнения скрипта в PHP - PullRequest
252 голосов
/ 11 февраля 2009

PHP должен отслеживать количество процессорного времени, которое конкретный сценарий использовал для обеспечения ограничения max_execution_time.

Есть ли способ получить доступ к этому внутри скрипта? Я хотел бы включить в мои тесты некоторые записи о том, сколько ЦП было сожжено в реальном PHP (время не увеличивается, когда скрипт сидит и ожидает базу данных).

Я использую коробку Linux.

Ответы [ 16 ]

457 голосов
/ 15 февраля 2012

Если все, что вам нужно, это время настенных часов, а не время выполнения ЦП, то вычислить просто:

//place this before any script you want to calculate time
$time_start = microtime(true); 

//sample script
for($i=0; $i<1000; $i++){
 //do anything
}

$time_end = microtime(true);

//dividing with 60 will give the execution time in minutes otherwise seconds
$execution_time = ($time_end - $time_start)/60;

//execution time of the script
echo '<b>Total Execution Time:</b> '.$execution_time.' Mins';
// if you get weird results, use number_format((float) $execution_time, 10) 

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

205 голосов
/ 11 февраля 2009

В системах Unixoid (и в php 7+ на Windows) вы можете использовать getrusage , например:

// Script start
$rustart = getrusage();

// Code ...

// Script end
function rutime($ru, $rus, $index) {
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}

$ru = getrusage();
echo "This process used " . rutime($ru, $rustart, "utime") .
    " ms for its computations\n";
echo "It spent " . rutime($ru, $rustart, "stime") .
    " ms in system calls\n";

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

91 голосов
/ 27 августа 2013

более короткая версия ответа talal7860

<?php
// At start of script
$time_start = microtime(true); 

// Anywhere else in the script
echo 'Total execution time in seconds: ' . (microtime(true) - $time_start);

Как указывалось, это «время настенного часа», а не «время процессора»

69 голосов
/ 25 июля 2014

Самый простой способ:

<?php

$time1 = microtime(true);

//script code
//...

$time2 = microtime(true);
echo 'script execution time: ' . ($time2 - $time1); //value in seconds
32 голосов
/ 17 мая 2013
<?php
// Randomize sleeping time
usleep(mt_rand(100, 10000));

// As of PHP 5.4.0, REQUEST_TIME_FLOAT is available in the $_SERVER superglobal array.
// It contains the timestamp of the start of the request with microsecond precision.
$time = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];

echo "Did nothing in $time seconds\n";
?>
24 голосов
/ 05 апреля 2014

Я создал класс ExecutionTime из ответа phihag, который вы можете использовать «из коробки»:

class ExecutionTime
{
     private $startTime;
     private $endTime;

     public function start(){
         $this->startTime = getrusage();
     }

     public function end(){
         $this->endTime = getrusage();
     }

     private function runTime($ru, $rus, $index) {
         return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
     }    

     public function __toString(){
         return "This process used " . $this->runTime($this->endTime, $this->startTime, "utime") .
        " ms for its computations\nIt spent " . $this->runTime($this->endTime, $this->startTime, "stime") .
        " ms in system calls\n";
     }
 }

использование:

$executionTime = new ExecutionTime();
$executionTime->start();
// code
$executionTime->end();
echo $executionTime;

Примечание. В PHP 5 функция getrusage работает только в системах Unix-oid. Начиная с PHP 7, он также работает в Windows.

11 голосов
/ 29 января 2013

Gringod на developerfusion.com дает хороший ответ:

<!-- put this at the top of the page --> 
<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $starttime = $mtime; 
;?> 

<!-- put other code and html in here -->


<!-- put this code at the bottom of the page -->
<?php 
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   $endtime = $mtime; 
   $totaltime = ($endtime - $starttime); 
   echo "This page was created in ".$totaltime." seconds"; 
;?>

С (http://www.developerfusion.com/code/2058/determine-execution-time-in-php/)

8 голосов
/ 22 февраля 2009

Я думаю, вам стоит взглянуть на xdebug. Параметры профилирования помогут вам узнать многие элементы, связанные с процессом.

http://www.xdebug.org/

8 голосов
/ 11 февраля 2009

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

Подсказка: ваше время выполнения PHP редко будет тем, что делает ваш сценарий тайм-аутом. Если срок действия сценария истекает, это почти всегда будет вызовом внешнего ресурса.

PHP микротайм документации: http://us.php.net/microtime

7 голосов
/ 23 ноября 2017

Будет лучше, если вы отформатируете выходные данные, например:

echo "Process took ". number_format(microtime(true) - $start, 2). " seconds.";

напечатает

Process took 6.45 seconds.

Это намного лучше, чем

Process took 6.4518549156189 seconds.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...