Eine PHP -Bibliothek, die verschiedene Backoff -Routinen (Delay) implementiert, wie z. B. exponentielle Backoffs. Die Klassen können zur Implementierung verschiedener Arten von Verzögerungen verwendet werden ( dh unter Verwendung von sleep() , Verzögerungen zwischen HTTP -Anforderungen ). Unten finden Sie ein beschreibenderes Beispiel. Um auszuführen, rufen Sie $class->backoff(); Die backoff() -Funktion wird in BackoffBase zum abstrakten und in den verschiedenen Kinderklassen implementierten.
Eine exponentielle Backoff -Verzögerung mit einem Standardponenten von 2 wird auf folgende Weise erhöht: 1, 2, 4, 16, 256
Eine inkrementelle Backoff -Verzögerung mit einem Standardinkrement von 1 erhöht auf folgende Weise: 1, 2, 3, 4, 5, 6, 7
Eine multiplikative Backoff -Verzögerung mit einem Standardponent von 2 wird auf folgende Weise erhöht: 0.5, 1, 2, 4, 8, 16, 32, 64
Beispielverwendung: Verwenden eines Backoff -Algorithmus, der API -Anrufe langsam zurückgibt, wenn sie einen "belebten" Statuscode zurückgeben, sodass der Server nicht von wiederholten Anforderungen überwältigt wird. Jedes Mal, wenn der Server einen "geschäftigen" Status zurückgibt, steigt die Verzögerung zwischen API -Aufrufen.
BackoffBase - Basisklasse, von der alle Backofflib -Klassen geerbt werden.BackoffCaller - mit einem angegebenen BackoffBase -Objekt: Implementiert einen Verzögerungs -Handler -Rückruf und eine Aufruffunktion. Kann verwendet werden, um schnell einen Backoff mit minimalem Code zu implementieren.BackoffExponential - exponentielles BackoffBackoffExponentialMax - Exponential Backoff mit MaxiumumwertBackoffIncremental - inkrementelle BackoffBackoffIncrementalMax - Inkrementelle Backoff mit MaxiumumwertBackoffMultiplicative - multiplikatives BackoffBackoffRandom - Zufälliger Backoff$Backoff->backoff(); - führt die Backoff -Implementierung aus.$Backoff->getInterval(); - Implementierung des Algorithmus für die angegebene Klasse. Modifiziert $Backoff->interval .$Backoff->getTime(); - Gibt den Wert der Backoff (Delay) $time nach dem Aufrufen backoff() zurück.$Backoff->getIntervalValue(); - Gibt den Wert des $interval für die Klasse zurück.
$BackoffCaller($bo,$cb,$delayCb); - Erstellt ein BackoffCaller -Objekt mit dem angegebenen BackoffBase -Objekt, einer bool function($data); Rückruf und eine int function($length) Verzögerungsrückruf (Rückgabe 0 über den Erfolg) .). Weitere beschreibende Nutzung finden Sie in Dateiheader.$BackoffCaller->run(); - führt den Rückruf in einer Schleife aus, bis er true zurückgibt.IBackoffMaximum - implementiert von Klassen mit einem maximalen Wert.phpunit im BackoffLib -Verzeichnis aus. 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 ist Open Source -Software, die unter der MIT -Lizenz verfügbar ist. Weitere Informationen finden Sie in der Lizenzdatei.