BackoffLib
1.0.0
实现各种退缩(延迟)例程的PHP库,例如指数向后。这些类可用于实现各种类型的延迟(即使用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对象:实现延迟处理程序回调和onfire回调函数。可用于快速用最小代码实现退缩。BackoffExponential - 指数退回BackoffExponentialMax mmax-指数向后带有maxium值BackoffIncremental - 增量向后BackoffIncrementalMax - 递增的缩写为Maxium值BackoffMultiplicative - 乘法退回BackoffRandom - 随机退缩$Backoff->backoff(); - 执行向后实现。$Backoff->getInterval(); - 给定类的算法实现。修改$Backoff->interval 。$Backoff->getTime(); - 返回呼叫backoff()后退回(延迟) $time的值。$Backoff->getIntervalValue(); - 返回班级$interval的值。
$BackoffCaller($bo,$cb,$delayCb); - 使用指定的BackoffBase对象,一个bool function($data);创建一个BackoffCaller对象;回调和int function($length)延迟回调(成功返回0 )。有关更多描述用法,请参见文件标头。$BackoffCaller->run(); - 在循环中执行回调,直到返回true 。IBackoffMaximum通过具有最大值的类实现。BackoffLib目录中执行phpunit 。 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是根据MIT许可证获得的开源软件。有关更多信息,请参见许可证文件。