Tamam, orada any sunucuya yazar olmadan istedi ne yapmak için hiçbir şekilde, ama en azından her isteği oturum ortadan kaldırabilir. Tek yönlü ({[(2 süre için sadece son talep izler "sızıntılı kova" azaltma yöntemi ($last_api_request
) ve istek / sınırı sayısının bir oran kullanılarak gereğidir )]}). Sızan kova (her saat sıfırlar Twitter API gaz aksine), sayacı sıfırlar asla, ama kova (kullanıcı sınırına ulaştı) dolarsa, onlar biraz boşaltmak için kova için n
saniye beklemeniz gerekir başka bir istek yapmadan önce. Diğer bir deyişle, bir yuvarlanan limiti gibi önceki istekleri süre içinde varsa, onlar yavaş yavaş kova dışarı sızdırıyor; Eğer kova doldurmak eğer sadece kısıtlar.
Bu kod parçacığı her istek üzerine yeni bir $minute_throttle
değerini hesaplamak olacaktır. Birden fazla hızlı bir şekilde kafa karıştırıcı yapmak için başlayacak rağmen .. vb, günlük, saatlik olarak herhangi bir süre için throttles ekleyebilirsiniz çünkü ben $minute_throttle
olarak minute belirtilen kullanıcılar.
$minute = 60;
$minute_limit = 100; # users are limited to 100 requests/minute
$last_api_request = $this->get_last_api_request(); # get from the DB; in epoch seconds
$last_api_diff = time() - $last_api_request; # in seconds
$minute_throttle = $this->get_throttle_minute(); # get from the DB
if ( is_null( $minute_limit ) ) {
$new_minute_throttle = 0;
} else {
$new_minute_throttle = $minute_throttle - $last_api_diff;
$new_minute_throttle = $new_minute_throttle < 0 ? 0 : $new_minute_throttle;
$new_minute_throttle += $minute / $minute_limit;
$minute_hits_remaining = floor( ( $minute - $new_minute_throttle ) * $minute_limit / $minute );
# can output this value with the request if desired:
$minute_hits_remaining = $minute_hits_remaining >= 0 ? $minute_hits_remaining : 0;
}
if ( $new_minute_throttle > $minute ) {
$wait = ceil( $new_minute_throttle - $minute );
usleep( 250000 );
throw new My_Exception ( 'The one-minute API limit of ' . $minute_limit
. ' requests has been exceeded. Please wait ' . $wait . ' seconds before attempting again.' )
);
}
# Save the values back to the database.
$this->save_last_api_request( time() );
$this->save_throttle_minute( $new_minute_throttle );