Kelas utilitas kecil untuk membantu membatasi waktu eksekusi skrip.
Kelas ini biasanya digunakan dalam loop dengan konsumsi waktu yang besar.
// 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
}
Sebagai ketergantungan produksi menggunakan Komposer:
composer require morjodrom/time-limiter
Sebagai ketergantungan pengembangan untuk kasus khusus pengembangan:
composer require --dev morjodrom/time-limiter
int $limitSeconds
- detik untuk diproses. 0 sama dengan tanpa batas. Nilai dari ini_get('max_execution_time')
mungkin merupakan opsi yang diinginkan.
[int $preliminaryTimeout] = DEFAULT_TIME_UP_SECONDS = 3
detik untuk menghentikan eksekusi awal sebelum mencapai batas waktu. $preliminaryTimeout
harus sedikit lebih besar dari operasi teoritis terpanjang yang Anda lakukan dalam satu lingkaran. Oleh karena itu, operasi berisiko terakhir yang mungkin melebihi waktu eksekusi akan dihilangkan. Kelas melacak waktu yang dihabiskan pada setiap iterasi untuk memperbarui $preliminaryTimeout agar sama dengan operasi terlama
[int|null $startTimestamp = $_SERVER['REQUEST_TIME']
digunakan secara default. Harus berupa stempel waktu sejak Unix Epoch (1 Januari 1970 00:00:00 GMT), misalnya panggilan time()
. Sangat dianjurkan untuk menggunakan konstruksi foreach
. Iterasi while
mentah juga dimungkinkan dengan panggilan Iterator yang benar
current(): int
- mengembalikan jumlah detik yang tersisa sebelum batas waktu valid(): bool
- mengembalikan jika masih ada waktu tersisa untuk menjalankan skrip dengan aman next(): void
- harus dipanggil setelah iterasi selesai untuk beradaptasi dengan iterasi panjang yang tidak terduga
Jangan ragu untuk membuka terbitan: https://github.com/Morjodrom/time-limiter/issues