time limiter
1.0.0
スクリプトの実行時間を制限するのに役立つ小さなユーティリティ クラス。
このクラスは通常、時間を大量に消費するループ内で使用されます。
// 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
}
Composer を使用した運用依存関係として:
composer require morjodrom/time-limiter
開発のみの場合の開発依存関係として:
composer require --dev morjodrom/time-limiter
int $limitSeconds
- 処理にかかる秒数。 0 は制限なしを意味します。 ini_get('max_execution_time')
の値が望ましいオプションである可能性があります。
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
秒。 $preliminaryTimeout
ループ内で実行する理論上の最長操作よりも少し長くする必要があります。したがって、実行時間を超える可能性がある最後の危険な操作は省略されます。このクラスは、各反復に費やした時間を追跡して、$preliminaryTimeout を最長の操作と等しくなるように更新します。
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
がデフォルトで使用されます。 Unix エポック (1970 年 1 月 1 日 00:00:00 GMT) 以降のタイムスタンプである必要があります (例: time()
呼び出し)。 foreach
構築に使用することを強くお勧めします。正しい Iterator 呼び出しを使用すれば、生のwhile
反復も可能です
current(): int
- タイムアウトまでの残り秒数を返しますvalid(): bool
- スクリプトを安全に実行する時間が残っているかどうかを返しますnext(): void
- 予想外の長い反復に適応するために、反復終了後に呼び出す必要があります
気軽に問題を開いてください: https://github.com/Morjodrom/time-limiter/issues