簡體   English   中英

PHP將總外部API請求限制為每秒8次

[英]PHP Limit total external API requests to 8 times per second

我的網站有一個腳本,當用戶訪問特定頁面時,該腳本將調用外部API。 訪問頁面時將發出API請求,並以xml格式返回響應。
我正在使用通常的卷曲請求。

現在,由於API方面的新實現,如果API獲得太多請求,它將拋出異常並拒絕該請求。
我想將從我的網站調用AP​​I的總次數限制為每秒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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM