Escribí una función que comprueba el tiempo de ejecución restante.
Advertencia: El tiempo de ejecución del recuento es diferente en Windows y en la plataforma 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.
}
}
caso de que el valor al final ser restado del valor al comienzo de la secuencia de comandos? Obtendré algunos números realmente extraños si no lo hago. Al igual que una página que tardó 0.05 segundos en generar dice que tomó 6 segundos de tiempo de CPU ... ¿es correcto? Vea aquí: http://blog.rompe.org/node/85 –
@Darryl Hein: Ah, y obtiene resultados extraños porque está utilizando la concatenación de cadenas en lugar de la suma;) – phihag
Dado que * .tv_usec está en microsegundos (1,000,000 por segundo) y * .tv_sec está en segundos, ¿no necesita multiplicar por 1000000 (o 1e6) en lugar de 1000? –