2012-03-21 19 views
0

我目前有一個腳本,部分地向外部站點發送請求。外部站點對於使用API​​的API每30秒只有一個簡單的API限制,並且如果它向主站點發送特定類型的請求(就像我的腳本所做的那樣),它每分鐘3次。現在,這對使用腳本的一個用戶很容易解決。但是,多個用戶將同時使用該腳本,如果有足夠的用戶同時使用該腳本,則限制將會結束。我試圖限制多用戶請求,以防止我的服務器發送超過限制,即使每個用戶都不是。我試圖找出一種方法來做到這一點。確保服務器永遠不會向外部網站發送太多請求。有沒有辦法做到這一點?限制多用戶請求到外部站點PHP?

+0

使用一些全球同步的標誌,像'memcache'記錄或信號量:http://php.net/manual/en/book.sem.php – kirilloid 2012-03-21 22:03:13

+0

將請求保存在數據庫中。使用cron腳本在外部站點每分鐘啓動它們3次。 – Cfreak 2012-03-21 22:03:47

+0

或更好,但使用真正的排隊機制。 – 2012-03-21 22:10:11

回答

0

token bucket algorithm與共享存儲器一起使用以限制速率。我實現了一個給你:bandwidth-throttle/token-bucket

這個例子將所有用戶的速率限制爲每30秒(即每分鐘100個請求)50個請求:

use bandwidthThrottle\tokenBucket\Rate; 
use bandwidthThrottle\tokenBucket\TokenBucket; 
use bandwidthThrottle\tokenBucket\storage\FileStorage; 

$storage = new FileStorage(__DIR__ . "/api.bucket"); 
$rate = new Rate(100, Rate::MINUTE); 
$bucket = new TokenBucket(50, $rate, $storage); 
$bucket->bootstrap(50); 

if (!$bucket->consume(1, $seconds)) { 
    http_response_code(429); 
    header(sprintf("Retry-After: %d", floor($seconds))); 
    exit(); 
}