Una biblioteca PHP que implementa varias rutinas de retroceso (retraso), como el retroceso exponencial. Las clases se pueden utilizar para implementar varios tipos de retrasos ( es decir, usando sleep() , retrasos entre las solicitudes HTTP ). Vea a continuación un ejemplo de uso más descriptivo. Para ejecutar, llame a $class->backoff(); La función backoff() se declara abstracta en BackoffBase e implementa en las diversas clases de niños.
Un retraso exponencial de retroceso con un exponente predeterminado de 2 se incrementará de la siguiente manera: 1, 2, 4, 16, 256
Un retraso incremental con un incremento predeterminado de 1 se incrementará de la siguiente manera: 1, 2, 3, 4, 5, 6, 7
Un retraso multiplicativo de retroceso con un exponente predeterminado de 2 se incrementará de la siguiente manera: 0.5, 1, 2, 4, 8, 16, 32, 64
Uso de ejemplo: usando un algoritmo de retroceso que retrocede lentamente las llamadas de API si devuelven un código de estado "ocupado" para que el servidor no esté abrumado por las solicitudes repetidas. Cada vez que el servidor devuelve un estado "ocupado", aumenta el retraso entre las llamadas de API.
BackoffBase - Clase base de la que se heredan todas las clases de Backofflib.BackoffCaller : con un objeto BackoffBase especificado: implementa una devolución de llamada del controlador de retraso y una función de devolución de llamada en On Fire. Se puede utilizar para implementar rápidamente un retroceso con un código mínimo.BackoffExponential - backoff exponencialBackoffExponentialMax - retroceso exponencial con valor maxiumumBackoffIncremental - retroceso incrementalBackoffIncrementalMax - retroceso incremental con el valor maxiumumBackoffMultiplicative - retroceso multiplicativoBackoffRandom - Backoff aleatorio$Backoff->backoff(); - Ejecuta la implementación de retroceso.$Backoff->getInterval(); - Implementación del algoritmo para la clase dada. Modifica $Backoff->interval .$Backoff->getTime(); - Devuelve el valor del retroceso (retraso) $time después de llamar backoff() .$Backoff->getIntervalValue(); - Devuelve el valor del $interval para la clase.
$BackoffCaller($bo,$cb,$delayCb); - Crea un objeto BackoffCaller con el objeto BackoffBase especificado, una bool function($data); devolución de llamada y una devolución de llamada de retraso de int function($length) (return 0 en el éxito) .). Consulte el encabezado de archivo para un uso más descriptivo.$BackoffCaller->run(); - Ejecuta la devolución de llamada en un bucle hasta que devuelva true .IBackoffMaximum : implementado por clases que tienen un valor máximo.phpunit en el directorio 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 es un software de código abierto, disponible bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.