Tracciamento del tempo di esecuzione dello script in PHP

PHP deve tenere traccia della quantità di tempo della CPU utilizzata da uno specifico script per applicare il limite max_execution_time.

C'è un modo per avere accesso a questo all'interno della sceneggiatura? Mi piacerebbe includere alcuni logging con i miei test su quanta CPU è stata masterizzata nel PHP attuale (il tempo non viene incrementato quando lo script è seduto e in attesa del database).

Sto usando una scatola Linux.

Sui sisthemes unixoid (e anche su php 7.0.0 su Windows), puoi usare getrusage , come:

// 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"; 

Si noti che non è necessario calcolare una differenza se si sta generando un'istanza di php per each test.

Se tutto ciò di cui hai bisogno è l'ora del wall-clock, piuttosto che il tempo di esecuzione della CPU, allora è semplice calcolare:

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

Si noti che questo includerà il tempo in cui PHP è seduto in attesa di risorse esterne come dischi o database, che non viene utilizzato per max_execution_time.

Versione più breve della risposta di 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); 

Come sottolineato, questo è "tempo wallclock" e non "tempo CPU"

La via più facile:

 <?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 arrays. // 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"; ?> 

Ho creato una class ExecutionTime dalla risposta di phihag che puoi usare fuori dagli schemi:

 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"; } } 

utilizzo:

 $executionTime = new ExecutionTime(); $executionTime->Start(); // code $executionTime->End(); echo $executionTime; 

Nota: la function getrusage funziona solo nei sisthemes unixoid e in php 7.0.0 su Windows.

Gringod at developerfusion.com dà questa buona risposta:

 <!-- 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"; ;?> 

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

Penso che dovresti dare un'occhiata a xdebug. Le opzioni di profilazione ti daranno un vantaggio sulla conoscenza di molti articoli correlati ai processi.

http://www.xdebug.org/

Il modo più economico e più sporco per farlo è semplicemente effettuare chiamate microtime() nei punti del codice che desideri confrontare. Fallo subito prima e subito dopo le query del database ed è semplice rimuovere tali durate dal resto del tempo di esecuzione dello script.

Un suggerimento: il tempo di esecuzione del tuo PHP è raramente la cosa che fa scadere il tuo script. Se uno script è scaduto, sarà quasi sempre una chiamata a una risorsa esterna.

Documentazione 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 ?> 

Puoi solo voler sapere il tempo di esecuzione di parti del tuo script. Il modo più flessibile per fare in modo che parti o un integer copione siano di creare 3 semplici funzioni (codice procedurale fornito qui ma potresti trasformarlo in una class inserendo il timer di class {} attorno ad esso e apportndo un paio di modifiche). Questo codice funziona, basta copiare e incollare ed eseguire:

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

Ho scritto una function che controlla il tempo di esecuzione rimanente.

Avvertenza: il count del tempo di esecuzione è diverso su Windows e sulla piattaforma 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); } 

usando:

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

In alternativa puoi semplicemente inserire questa row nei tuoi blocchi di codice e controllare i log di php, per le funzioni veramente lente è piuttosto utile:

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

Per il debugging serio usa XDebug + Cachegrind, vedi https://blog.nexcess.net/2011/01/29/diagnosing-slow-php-execution-with-xdebug-and-kcachegrind/

Sta diventando più carino se si formatta l'output dei secondi come:

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

stamperà

 Process took 6.45 seconds. 

Questo è molto meglio di

 Process took 6.4518549156189 seconds.