Seguimiento del tiempo de ejecución del script en PHP

Resuelto twk asked hace 54 años • 21 respuestas

PHP debe realizar un seguimiento de la cantidad de tiempo de CPU que ha utilizado un script en particular para hacer cumplir el límite max_execution_time.

¿Hay alguna manera de acceder a esto dentro del script? Me gustaría incluir algunos registros con mis pruebas sobre cuánta CPU se quemó en el PHP real (el tiempo no aumenta cuando el script está esperando la base de datos).

Estoy usando una caja de Linux.

twk avatar Jan 01 '70 08:01 twk
Aceptado

Si todo lo que necesita es el tiempo del reloj de pared, en lugar del tiempo de ejecución de la CPU, entonces es sencillo de calcular:

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

Tenga en cuenta que esto incluirá el tiempo que PHP permanece esperando recursos externos como discos o bases de datos, que no se utiliza para max_execution_time.

talal7860 avatar Feb 15 '2012 06:02 talal7860

En sistemas Unixoid (y también en php 7+ en Windows), puedes usar getrusage , como:

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

Tenga en cuenta que no necesita calcular una diferencia si genera una instancia de PHP para cada prueba.

phihag avatar Feb 11 '2009 01:02 phihag

Versión más corta de la respuesta de 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);

Como se señaló, este es el "tiempo del reloj de pared", no el "tiempo de la CPU".

C. Lee avatar Aug 27 '2013 00:08 C. Lee
<?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";
?>
Joyal avatar May 17 '2013 15:05 Joyal

Creé una clase ExecutionTime a partir de la respuesta de phihag que puedes usar de inmediato:

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

Uso:

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

Nota: En PHP 5, la getrusagefunción solo funciona en sistemas Unix-oid. Desde PHP 7, también funciona en Windows.

Hamid Tavakoli avatar Apr 05 '2014 18:04 Hamid Tavakoli