Eine kleine Dienstprogrammklasse, die hilft, die Ausführungszeit von Skripten zu begrenzen.
Die Klasse wird üblicherweise innerhalb von Schleifen mit hohem Zeitaufwand verwendet.
// 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
}
Als Produktionsabhängigkeit mit Composer:
composer require morjodrom/time-limiter
Als Entwicklungsabhängigkeit für reine Entwicklungsfälle:
composer require --dev morjodrom/time-limiter
int $limitSeconds
– Sekunden zur Verarbeitung. 0 bedeutet keine Begrenzung. Der Wert von ini_get('max_execution_time')
könnte die gewünschte Option sein.
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
Sekunden, um die Ausführung vor Erreichen des Timeouts vorläufig zu stoppen. $preliminaryTimeout
muss etwas größer sein als die längste theoretische Operation, die Sie in einer Schleife ausführen. Daher wird der letzte riskante Vorgang, der die Ausführungszeit überschreiten könnte, weggelassen. Die Klasse verfolgt die Zeit, die für jede Iteration aufgewendet wird, um $preliminaryTimeout so zu aktualisieren, dass es dem längsten Vorgang entspricht
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
wird standardmäßig verwendet. Muss ein Zeitstempel seit der Unix-Epoche (1. Januar 1970, 00:00:00 GMT) sein, z. B. time()
-Aufruf. Es wird dringend empfohlen, foreach
Konstruktion zu verwenden. Bei korrekten Iterator-Aufrufen ist auch eine rohe Iteration while
des Prozesses möglich
current(): int
– gibt die Anzahl der verbleibenden Sekunden bis zum Timeout zurück. valid(): bool
– gibt zurück, wenn noch Zeit für die sichere Ausführung des Skripts übrig ist. next(): void
– muss nach einer abgeschlossenen Iteration aufgerufen werden, um sich an unerwartet lange Iterationen anzupassen
Fühlen Sie sich frei, ein Problem zu eröffnen: https://github.com/Morjodrom/time-limiter/issues