Отслеживание времени выполнения скрипта в PHP

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

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

Я использую ящик Linux.

В unixoid системах (и в php 7.0.0 на 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 для каждого теста.

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

 //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 other wise seconds $execution_time = ($time_end - $time_start)/60; //execution time of the script echo '<b>Total Execution Time:</b> '.$execution_time.' Mins'; 

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

Более короткая версия ответа 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); 

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

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

 <?php $time1 = microtime(true); //script code //... $time2 = microtime(true); echo 'script execution time: ' . ($time2 - $time1); //value in seconds 
 <?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"; ?> 

Я создал класс 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; 

Примечание. Функция getrusage работает только в системах unixoid и в php 7.0.0 в Windows.

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/ )

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

http://www.xdebug.org/

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

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

Документация PHP microtime: http://us.php.net/microtime

 <?php $time1 = microtime(true); //script code //...for or if or any thing you want to know! $time2 = microtime(true); echo 'Total execution time: ' . ($time2 - $time1);//value in seconds ?> 

Вы можете только знать время выполнения частей вашего скрипта. Самый гибкий способ создания временных частей или всего скрипта – создать 3 простые функции (здесь приведено процедурный код, но вы можете превратить его в класс, добавив вокруг него класс timer {} и сделав пару настроек). Этот код работает, просто скопируйте и вставьте и запустите:

 $tstart = 0; $tend = 0; function timer_starts() { global $tstart; $tstart=microtime(true); ; } function timer_ends() { global $tend; $tend=microtime(true); ; } function timer_calc() { global $tstart,$tend; return (round($tend - $tstart,2)); } timer_starts(); file_get_contents('http://google.com'); timer_ends(); print('It took '.timer_calc().' seconds to retrieve the google page'); 

Я написал функцию, которая проверяет оставшееся время выполнения.

Предупреждение. Счет времени выполнения отличается в Windows и на платформе Linux.

 /** * Check if more that `$miliseconds` ms remains * to error `PHP Fatal error: Maximum execution time exceeded` * * @param int $miliseconds * @return bool */ function isRemainingMaxExecutionTimeBiggerThan($miliseconds = 5000) { $max_execution_time = ini_get('max_execution_time'); if ($max_execution_time === 0) { // No script time limitation return true; } if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { // On Windows: The real time is measured. $spendMiliseconds = (microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"]) * 1000; } else { // On Linux: Any time spent on activity that happens outside the execution // of the script such as system calls using system(), stream operations // database queries, etc. is not included. // @see http://php.net/manual/en/function.set-time-limit.php $resourceUsages = getrusage(); $spendMiliseconds = $resourceUsages['ru_utime.tv_sec'] * 1000 + $resourceUsages['ru_utime.tv_usec'] / 1000; } $remainingMiliseconds = $max_execution_time * 1000 - $spendMiliseconds; return ($remainingMiliseconds >= $miliseconds); } 

С помощью:

 while (true) { // so something if (!isRemainingMaxExecutionTimeBiggerThan(5000)) { // Time to die. // Safely close DB and done the iteration. } } 

В качестве альтернативы вы можете просто поместить эту строку в свои блоки кода и проверить журналы php, для действительно медленных функций это очень полезно:

 trigger_error("Task done at ". strftime('%H:%m:%S', time()), E_USER_NOTICE); 

Для серьезной отладки используйте XDebug + Cachegrind, см. https://blog.nexcess.net/2011/01/29/diagnosing-slow-php-execution-with-xdebug-and-kcachegrind/

Он будет красивее, если вы отформатируете выходные секунды следующим образом:

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

распечатает

 Process took 6.45 seconds. 

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

 Process took 6.4518549156189 seconds.