Une petite classe utilitaire pour aider à limiter le temps d'exécution des scripts.
La classe est généralement utilisée dans des boucles très consommatrices de temps.
// 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
}
En tant que dépendance de production utilisant Composer :
composer require morjodrom/time-limiter
En tant que dépendance de développement pour les cas de développement uniquement :
composer require --dev morjodrom/time-limiter
int $limitSeconds
- secondes à traiter. 0 équivaut à aucune limite. La valeur de ini_get('max_execution_time')
peut être l'option souhaitée.
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
secondes pour arrêter l'exécution préliminaire avant d'atteindre le délai d'attente. $preliminaryTimeout
doit être un peu supérieur à l'opération théorique la plus longue que vous effectuez en boucle. Par conséquent, la dernière opération risquée susceptible de dépasser le temps d’exécution est omise. La classe suit le temps passé sur chaque itération pour mettre à jour $preliminaryTimeout afin qu'il soit égal à l'opération la plus longue.
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
est utilisé par défaut. Doit être un horodatage depuis l'époque Unix (1er janvier 1970 00:00:00 GMT), par exemple un appel time()
. Il est fortement encouragé à utiliser foreach
construction. L'itération brute while
l'itération est également possible avec des appels d'itérateur corrects
current(): int
- renvoie le nombre de secondes restantes avant l'expiration du délai valid(): bool
- renvoie s'il reste du temps pour exécuter le script en toute sécurité next(): void
- doit être appelé après une itération terminée pour s'adapter aux longues itérations inattendues
N'hésitez pas à ouvrir un numéro : https://github.com/Morjodrom/time-limiter/issues