Seguimiento del tiempo de ejecución del script en PHP
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.
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
.
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.
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".
<?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";
?>
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
getrusage
función solo funciona en sistemas Unix-oid. Desde PHP 7, también funciona en Windows.