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許可證獲得的開源軟件。有關更多信息,請參見許可證文件。