คลาสยูทิลิตี้ขนาดเล็กที่ช่วยจำกัดเวลาการดำเนินการสคริปต์
โดยปกติคลาสจะใช้ภายในลูปโดยใช้เวลานาน
// 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 Epoch (1 มกราคม 1970 00:00:00 GMT) เช่น การเรียก time()
ขอแนะนำอย่างยิ่งให้ใช้การก่อสร้าง foreach
Raw while
การวนซ้ำยังสามารถทำได้ด้วยการเรียก Iterator ที่ถูกต้อง
current(): int
- ส่งคืนจำนวนวินาทีที่เหลือก่อนหมดเวลา valid(): bool
- ส่งคืนหากมีเวลาเหลือในการดำเนินการสคริปต์อย่างปลอดภัย next(): void
- ต้องถูกเรียกหลังจากการวนซ้ำเสร็จสิ้นเพื่อปรับให้เข้ากับการวนซ้ำที่ยาวนานโดยไม่คาดคิด
อย่าลังเลที่จะเปิดปัญหา: https://github.com/Morjodrom/time-limiter/issues