Uma biblioteca PHP que implementa várias rotinas de retirada (atraso), como o retorno exponencial. As classes podem ser usadas para implementar vários tipos de atrasos ( ou seja, usando sleep() , atrasos entre solicitações HTTP ). Veja abaixo um exemplo de uso mais descritivo. Para executar, ligue para $class->backoff(); A função backoff() é declarada abstrata no BackoffBase e implementada nas várias classes infantis.
Um atraso exponencial de retirada com um expoente padrão de 2 aumentará da seguinte maneira: 1, 2, 4, 16, 256
Um atraso incremental de retorno com um incremento padrão de 1 incremento da seguinte maneira: 1, 2, 3, 4, 5, 6, 7
Um atraso multiplicativo de retirada com um expoente padrão de 2 aumentará da seguinte maneira: 0.5, 1, 2, 4, 8, 16, 32, 64
Exemplo de uso: o uso de um algoritmo de retirada que recua lentamente as chamadas da API se retornar um código de status "ocupado" para que o servidor não fique sobrecarregado por solicitações repetidas. Cada vez que o servidor retorna um status "ocupado", o atraso entre as chamadas da API aumenta.
BackoffBase - Classe base da qual todas as classes de backofflib são herdadas.BackoffCaller - com um objeto especificado BackoffBase : implementa um retorno de chamada de manipulador de atraso e uma função de retorno de chamada onfire. Pode ser usado para implementar rapidamente um retorno com código mínimo.BackoffExponential - retomado exponencialBackoffExponentialMax - retomado exponencial com valor maxiumumBackoffIncremental - RECONHECIMENTO INCORMENTALBackoffIncrementalMax - retorno incremental com o valor maxiumumBackoffMultiplicative - retomado multiplicativoBackoffRandom - RABUNFOF$Backoff->backoff(); - Executa a implementação de retirada.$Backoff->getInterval(); - Implementação do algoritmo para a classe fornecida. Modifica $Backoff->interval .$Backoff->getTime(); - Retorna o valor do retorno (atraso) $time depois de ligar backoff() .$Backoff->getIntervalValue(); - Retorna o valor do $interval para a classe.
$BackoffCaller($bo,$cb,$delayCb); - Cria um objeto BackoffCaller com o objeto BackoffBase especificado, uma bool function($data); retorno de chamada e uma int function($length) atraso de retorno (retorno 0 no sucesso) .). Consulte o cabeçalho do arquivo para obter um uso mais descritivo.$BackoffCaller->run(); - Executa o retorno de chamada em um loop até que ele retorne true .IBackoffMaximum - implementado por classes com um valor máximo.phpunit no diretório 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 é um software de código aberto, disponível sob a licença do MIT. Consulte o arquivo de licença para obter mais informações.