Uma pequena classe de utilitário para ajudar a limitar o tempo de execução do script.
A classe geralmente é usada em loops com grande consumo de tempo.
// 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 uma dependência de produção usando o Composer:
composer require morjodrom/time-limiter
Como uma dependência de desenvolvimento para casos somente de desenvolvimento:
composer require --dev morjodrom/time-limiter
int $limitSeconds
– segundos para processar. 0 é igual a nenhum limite. O valor de ini_get('max_execution_time')
pode ser a opção desejada.
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
segundos para interromper a execução preliminar antes de atingir o tempo limite. $preliminaryTimeout
deve ser um pouco maior que a operação teórica mais longa que você executa em um loop. Portanto, a última operação arriscada que possa exceder o tempo de execução é omitida. A classe rastreia o tempo gasto em cada iteração para atualizar $preliminaryTimeout para igualar a operação mais longa
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
é usado por padrão. Deve ser um carimbo de data e hora desde a época do Unix (1º de janeiro de 1970 00:00:00 GMT), por exemplo, chamada time()
. É altamente recomendável usar foreach
construção. Raw while
a iteração também é possível com chamadas corretas do Iterator
current(): int
- retorna o número de segundos restantes antes do tempo limite valid(): bool
- retorna se ainda houver tempo para executar o script com segurança next(): void
- deve ser chamado após uma iteração concluída para se adaptar a iterações longas inesperadas
Sinta-se à vontade para abrir um problema: https://github.com/Morjodrom/time-limiter/issues