Perpustakaan PHP yang mengimplementasikan berbagai rutinitas backoff (penundaan), seperti backoff eksponensial. Kelas dapat digunakan untuk menerapkan berbagai jenis penundaan ( yaitu menggunakan sleep() , penundaan antara permintaan HTTP ). Lihat di bawah untuk contoh penggunaan yang lebih deskriptif. Untuk mengeksekusi, hubungi $class->backoff(); Fungsi backoff() dinyatakan abstrak di BackoffBase dan diimplementasikan di berbagai kelas anak.
Penundaan backoff eksponensial dengan eksponen default 2 akan bertambah dengan cara berikut: 1, 2, 4, 16, 256
Penundaan backoff tambahan dengan peningkatan default 1 akan bertambah dengan cara berikut: 1, 2, 3, 4, 5, 6, 7
Penundaan backoff multiplikatif dengan eksponen default 2 akan bertambah dengan cara berikut: 0.5, 1, 2, 4, 8, 16, 32, 64
Contoh Penggunaan: Menggunakan algoritma backoff yang perlahan -lahan mundur panggilan API jika mereka mengembalikan kode status "sibuk" sehingga server tidak kewalahan dengan permintaan yang diulang. Setiap kali server mengembalikan status "sibuk", keterlambatan antara panggilan API meningkat.
BackoffBase - kelas dasar yang semua kelas backofflib diwariskan.BackoffCaller - Dengan objek BackoffBase yang ditentukan: mengimplementasikan callback penangan penundaan dan fungsi panggilan balik onfire. Dapat digunakan untuk dengan cepat menerapkan backoff dengan kode minimal.BackoffExponential - backoff eksponensialBackoffExponentialMax - backoff eksponensial dengan nilai maxiumumBackoffIncremental - Backoff tambahanBackoffIncrementalMax - backoff tambahan dengan nilai maxiumumBackoffMultiplicative - backoff multiplikasiBackoffRandom - backoff acak$Backoff->backoff(); - mengeksekusi implementasi backoff.$Backoff->getInterval(); - Implementasi algoritma untuk kelas yang diberikan. Memodifikasi $Backoff->interval .$Backoff->getTime(); - Mengembalikan nilai backoff (tunda) $time setelah menelepon backoff() .$Backoff->getIntervalValue(); - Mengembalikan nilai $interval untuk kelas.
$BackoffCaller($bo,$cb,$delayCb); - Membuat objek BackoffCaller dengan objek BackoffBase yang ditentukan, bool function($data); callback, dan int function($length) tunda callback (return 0 on Success) .). Lihat header file untuk penggunaan deskriptif yang lebih banyak.$BackoffCaller->run(); - Menjalankan panggilan balik dalam satu loop sampai mengembalikan true .IBackoffMaximum - Diimplementasikan oleh kelas yang memiliki nilai maksimum.phpunit di direktori 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 adalah perangkat lunak open source, tersedia di bawah lisensi MIT. Lihat file lisensi untuk informasi lebih lanjut.