Una pequeña clase de utilidad para ayudar a limitar el tiempo de ejecución del script.
La clase se utiliza normalmente en bucles que consumen mucho tiempo.
// maximum time to execute one request
$ REQUEST_TIMEOUT_SEC = 5 ;
$ curlClient = new SomeCurlClient (); // just an example.
// shared hosting often has a limit. E.g. 30 seconds
$ maxExecutionTime = ini_get ( ' max_execution_time ' );
$ timeLimiter = new timelimiter TimeLimiter ( $ maxExecutionTime , $ REQUEST_TIMEOUT_SEC );
// check if there is time left to prevent 504 timeout
// recommended
foreach ( $ timeLimiter => $ timeLeft ){
$ result = $ curlClient -> doSomeHeavyJob ([
' timeout ' => $ REQUEST_TIMEOUT_SEC
]);
// handle the result
// ...
}
// or alternatively while loop might be used with respective Iterator calls.
while ( $ timeLimiter -> valid ()){
$ result = $ curlClient -> doSomeHeavyJob ([
' timeout ' => $ REQUEST_TIMEOUT_SEC
]);
$ timeLimiter -> next (); // must be called to adapt to long iterations
}
Como dependencia de producción usando Composer:
composer require morjodrom/time-limiter
Como dependencia de desarrollo para casos exclusivos de desarrollo:
composer require --dev morjodrom/time-limiter
int $limitSeconds
- segundos para procesar. 0 es igual a ningún límite. El valor de ini_get('max_execution_time')
podría ser la opción deseada.
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
segundos para detener la ejecución preliminar antes de alcanzar el tiempo de espera. $preliminaryTimeout
debe ser un poco mayor que la operación teórica más larga que realice en un bucle. Por tanto, se omite la última operación de riesgo que pueda exceder el tiempo de ejecución. La clase realiza un seguimiento del tiempo dedicado a cada iteración para actualizar $preliminaryTimeout para igualar la operación más larga.
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
se utiliza de forma predeterminada. Debe ser una marca de tiempo desde la época Unix (1 de enero de 1970 00:00:00 GMT), por ejemplo, llamada time()
. Se recomienda encarecidamente su uso foreach
construcción. La iteración while
procesar también es posible con llamadas correctas al iterador.
current(): int
- devuelve el número de segundos que quedan antes del tiempo de espera valid(): bool
- devuelve si queda tiempo para realizar el script de forma segura next(): void
- se debe llamar después de una iteración finalizada para adaptarse a iteraciones largas inesperadas
No dudes en abrir un problema: https://github.com/Morjodrom/time-limiter/issues