مكتبة PHP التي تنفذ إجراءات مختلفة لتراجع (تأخير) ، مثل التراجع الأسي. يمكن استخدام الفصول لتنفيذ أنواع مختلفة من التأخير ( IE باستخدام sleep() ، والتأخير بين طلبات HTTP ). انظر أدناه للحصول على مثال أكثر وصفية. للتنفيذ ، اتصل بالدولار $class->backoff(); يتم الإعلان عن وظيفة backoff() مجردة في BackoffBase وتنفيذها في فصول الأطفال المختلفة.
سوف يؤدي تأخير التراجع الأسي مع الأسس الافتراضي من 2 إلى زيادة بالطريقة التالية: 1, 2, 4, 16, 256
سيؤخر تأخير التراجع الإضافي مع زيادة افتراضية من 1 بالطريقة التالية: 1, 2, 3, 4, 5, 6, 7
سوف يزداد تأخير التراجع المتعدد مع الأسس الافتراضي من 2 بالطريقة التالية: 0.5, 1, 2, 4, 8, 16, 32, 64
مثال على الاستخدام: استخدام خوارزمية التراجع التي تتراجع ببطء عن مكالمات API إذا قاموا بإرجاع رمز الحالة "مشغول" بحيث لا يطغى عليه الخادم بالطلبات المتكررة. في كل مرة يقوم الخادم بإرجاع حالة "مشغول" ، يزداد التأخير بين مكالمات API.
BackoffBase - فئة قاعدة أن جميع فصول backofflib ورثت منها.BackoffCaller - مع كائن BackoffBase محدد: ينفذ رد اتصال معالج التأخير ودالة رد الاتصال على Fire. يمكن استخدامها لتنفيذ التراجع بسرعة مع الحد الأدنى من الرمز.BackoffExponential - دعم أسيBackoffExponentialMax - دعم أسي مع قيمة maxiumumBackoffIncremental - التراجع الإضافيBackoffIncrementalMax - التراجع الإضافي مع قيمة maxiumumBackoffMultiplicative - التراجع المتعددBackoffRandom - التراجع العشوائي$Backoff->backoff(); - ينفذ تنفيذ التراجع.$Backoff->getInterval(); - تنفيذ الخوارزمية للفئة المعطاة. يعدل $Backoff->interval .$Backoff->getTime(); - إرجاع قيمة التراجع (التأخير) $time بعد استدعاء backoff() .$Backoff->getIntervalValue(); - إرجاع قيمة $interval للفئة.
$BackoffCaller($bo,$cb,$delayCb); - ينشئ كائن BackoffCaller مع كائن BackoffBase المحدد ، bool function($data); رد الاتصال ، ودالة int function($length) تأخير رد الاتصال (إرجاع 0 على النجاح) .). انظر رأس الملف لمزيد من الاستخدام الوصفي.$BackoffCaller->run(); - ينفذ رد الاتصال في حلقة حتى يعود true .IBackoffMaximum - تنفذها الفئات ذات القيمة القصوى.phpunit في دليل BackoffLib . require ( ' BackoffLib/Backoff.php ' );
$ be = new BackoffLib BackoffIncrementalMax ( 1 , 2 ); //increment by 1, max 2
function beo ( $ b ) {
$ b -> backoff ();
echo "$ b->time = " . $ b -> getTime () . PHP_EOL ;
}
for ( $ i = 1 ; $ i <= 5 ; $ i ++)
beo ( $ be );
echo " be->getCount = " . $ be -> getCount () . PHP_EOL ; require ( ' BackoffLib/Backoff.php ' );
$ be = new BackoffLib BackoffExponential ( 2.0 );
function beo ( $ b , $ backoff = true ) {
if ( $ backoff )
$ b -> backoff ();
echo "$ b->time = " . $ b -> getTime () . PHP_EOL ;
}
beo ( $ be , false );
beo ( $ be );
beo ( $ be );
beo ( $ be );
beo ( $ be );BackoffCaller require_once ( ' BackoffLib/Backoff.php ' );
define ( ' CB_MAX_COUNTER ' , 10 ); //hard limit for number of times the callback fires
define ( ' CB_MAX_DELAY ' , 64 ); //good limit for multiplicative backoff
//callback that fires on each backoff call
$ backoff_callback = function ( $ delayValue ) {
static $ counter = 0 ;
$ counter ++;
if ( is_numeric ( $ delayValue ))
$ delayValue = sprintf ( " %.2f " , $ delayValue ); //truncate the value
//output the call counter and the delay value
echo " [debug] callback # $ {counter}t $ {delayValue} n" ;
if ( isset ( $ delayValue ) && is_numeric ( $ delayValue ))
if ( $ delayValue >= CB_MAX_DELAY )
return true ; //halt backoffCaller execution, the delay has reached its maximum allowed value
if ( $ counter >= CB_MAX_COUNTER )
return true ; //halt execution, the callback counter has reached its maximum allowed value.
return false ; //continue backoffCaller execution: the next delay->backoff calls will occur
};
$ backoff_delay_callback = function ( $ len ) {
sleep ( $ len ); //implement a delay using sleep(): anything could be done here, i.e. limit the max delay.
return 0 ; //return 0 on success: the next backoff call will occur
};
//create a backoff that multiplies the interval by 2 each time it backs off
$ backoffClass = new BackoffLib BackoffMultiplicative ( 2.0 );
//create a caller class, that implements a basic delay-on-fire. the delay is actually handled in the callback.
$ backoff = new BackoffLib BackoffCaller ( $ backoffClass , $ backoff_callback , $ backoff_delay_callback );
$ backoff -> run (); //begin execution: can only be halted by returning TRUE from the callback. BackoffLib هو برنامج مفتوح المصدر ، متاح بموجب ترخيص معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من المعلومات.