[英]PHP Limit total external API requests to 8 times per second
我的網站有一個腳本,當用戶訪問特定頁面時,該腳本將調用外部API。 訪問頁面時將發出API請求,並以xml格式返回響應。
我正在使用通常的卷曲請求。
現在,由於API方面的新實現,如果API獲得太多請求,它將拋出異常並拒絕該請求。
我想將從我的網站調用API的總次數限制為每秒8次。
我怎樣才能做到這一點? 有人建議我排隊請求,但我以前從未做過這樣的事情,而且我很難找到解決方案。
對不起,如果我的英語有錯誤。 任何幫助表示贊賞。
例如:如果100個用戶同時訪問了所有網頁,我需要在每秒8次之后將這些API請求排隊8,依此類推,直到完成所有操作。
$currentCount=0;
$currentSeconds;
function callAPI()
{
if($currentCount<8 || date("s") != $currentSeconds)
{
if(date("s") != $currentSeconds)
{
$currentCount=0;
}
$currentSeconds=date("s");
//call your API here
$currentCount++;
}
}
對於每個API調用:
- 記錄變量中的當前時間(僅秒)。
- 進行API調用。
- 增加一個呼叫計數器。
- 如果當前秒數等於先前存儲的值並且您的呼叫計數器低於8,則再次檢查。如果您的呼叫計數器低於8,您可以再撥打一個電話。
我建議你使用一個api generate在每個請求上創建令牌和匹配令牌,並在一段時間后執行到期或刪除令牌。 因此可能會解決您的多個請求問題。
您可以將API請求延遲微秒,這是示例代碼
usleep(1250000);//1 sec = 10,000,00 ms
function _callAPI(){
// Your code here
}
當用戶訪問您的站點時,請求將在幾微秒后觸發,這樣您就可以延遲請求。
您還可以在為API觸發請求時並根據先前的請求維護日志,從而獲得下一個請求。
每秒8次呼叫的值很低,因此每次呼叫嘗試都可以保存在數據庫中,並且每次每秒最多計算一次呼叫次數。
對於較大的值,通常在nosql數據庫中使用計數器,如Cassandra或Aerospike。 即每個請求您獲得當前時間並增加計數器名稱“計數器”+秒,直到您達到所需的限制。
如果負載非常高(1000 + cps),Aerospike是最好的,它提供非常低的延遲。 Cassandra使用起來更簡單,需要更少的內存。
記憶的內存更少。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.