Une bibliothèque PHP qui met en œuvre diverses routines de backoff (retard), telles que le backoff exponentiel. Les classes peuvent être utilisées pour implémenter différents types de retards ( c'est-à-dire en utilisant sleep() , les retards entre les demandes HTTP ). Voir ci-dessous pour un exemple d'utilisation plus descriptif. Pour exécuter, appelez $class->backoff(); La fonction backoff() est déclarée abstraite dans BackoffBase et implémentée dans les différentes classes enfants.
Un délai de revers exponentiel avec un exposant par défaut de 2 augmentera de la manière suivante: 1, 2, 4, 16, 256
Un délai de revers incrémentiel avec un incrément par défaut de 1 augmentera de la manière suivante: 1, 2, 3, 4, 5, 6, 7
Un retard de revers multiplicatif avec un exposant par défaut de 2 augmentera de la manière suivante: 0.5, 1, 2, 4, 8, 16, 32, 64
Exemple d'utilisation: à l'aide d'un algorithme de revers qui recule lentement des appels d'API s'ils renvoient un code d'état "occupé" afin que le serveur ne soit pas submergé par des demandes répétées. Chaque fois que le serveur renvoie un statut "occupé", le retard entre les appels API augmente.
BackoffBase - Classe de base dont toutes les classes Backofflib sont héritées.BackoffCaller - avec un objet BackoffBase spécifié: implémente un rappel de gestionnaire de retard et une fonction de rappel OnFire. Peut être utilisé pour implémenter rapidement une revers avec un code minimal.BackoffExponential - backoff exponentielBackoffExponentialMax - revers exponentiel avec valeur maxiumBackoffIncremental - Backoff incrémentielBackoffIncrementalMax - Backoff incrémentiel avec valeur maxiumBackoffMultiplicative - Backoff multiplicatifBackoffRandom - backoff aléatoire$Backoff->backoff(); - Exécute l'implémentation de revers.$Backoff->getInterval(); - Implémentation de l'algorithme pour la classe donnée. Modifie $Backoff->interval .$Backoff->getTime(); - Renvoie la valeur du $time après avoir appelé backoff() .$Backoff->getIntervalValue(); - Renvoie la valeur de l' $interval pour la classe.
$BackoffCaller($bo,$cb,$delayCb); - Crée un objet BackoffCaller avec l'objet BackoffBase spécifié, une bool function($data); rappel, et une int function($length) de délai de délai (return 0 sur succès) .). Voir l'en-tête de fichier pour une utilisation plus descriptive.$BackoffCaller->run(); - Exécute le rappel dans une boucle jusqu'à ce qu'il renvoie true .IBackoffMaximum - Implémenté par des classes ayant une valeur maximale.phpunit dans le répertoire 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 est un logiciel open source, disponible sous la licence MIT. Voir le fichier de licence pour plus d'informations.