فئة فائدة صغيرة للمساعدة في تحديد وقت تنفيذ البرنامج النصي.
عادةً ما يتم استخدام الفصل ضمن حلقات ذات استهلاك كبير للوقت.
// 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 (1 يناير 1970 الساعة 00:00:00 بتوقيت جرينتش)، على سبيل المثال استدعاء time()
. يُنصح بشدة باستخدام foreach
بناء. Raw while
التكرار ممكن أيضًا من خلال استدعاءات Iterator الصحيحة
current(): int
- يُرجع عدد الثواني المتبقية قبل انتهاء المهلة valid(): bool
- يُرجع إذا كان هناك وقت متبقي لتنفيذ البرنامج النصي بأمان next(): void
- يجب استدعاؤه بعد التكرار النهائي للتكيف مع التكرارات الطويلة غير المتوقعة
لا تتردد في فتح مشكلة: https://github.com/Morjodrom/time-limiter/issues