2017-02-14 196 views
1

我有一個APIPHPnusoap,它在具有Apache網絡服務器的服務器上啓動。不同的遠程客戶端向我的API函數發送請求並獲得響應。我想通過這種方式將客戶端請求限制爲特定功能:限制發送到服務器的客戶端請求的數量

客戶端可以在每秒發送請求的限制,並且此限制存儲在mysql數據庫中。每個客戶端都必須能夠發送請求到其限制。例如,如果爲客戶端定義的最大請求數爲300,則不允許以秒爲單位發送超過300個請求。

如何使用PHP或Apache實現此規則?

+0

你不能做任何事情阻止客戶 - 如果他們想發送請求時,就會發送請求。你可以做什麼,決定了如何處理這些請求,一旦他們到達你的服務器。 (只是提到這一點,因爲它是一個重要的區別,他們的方式是你的問題措詞,似乎是疑惑,如果你知道這一點。) – CBroe

+0

你可能想看看[安全的PHP代理]( https://stackoverflow.com/questions/13440663/secure-a-php-proxy) – ajoposor

回答

1

完美的解決方案是使用PHP來處理。每個打到你API的請求都應該有一個唯一的標記。它可以被添加到URL地址,如http://yousite/api/method?token=sample_token。該令牌被分配給特定的客戶端/用戶。

您只需將此操作記錄到數據庫中即可。表格將具有非常簡單的結構 - id, client_id(token), created_at, action。行動不是強制性的,但可能在未來有用。

現在,您可以添加一個處理程序到您的API,這將限制一些請求。您可以在控制器中的每個操作的開始處,控制器創建之前的事件監聽器或安全層中添加此項。

if (new (ApiRequestsRepository())->getNumberOfRequestsForLastHour($token) > 300) { 
    throw new Exception('Number of allowed requests exceeded. 300 requests per hour allowed.'); 
} 

我希望這很有幫助。如果你說你使用了什麼樣的框架,我可以給你更具體的例子。

ApiRequestsRepository是一個類,它將通過getNumberOfRequestsForLastHour方法提供您已經使用的令牌數。 getNumberOfRequestsForLastHour將調用查詢或多或少像這樣的方法:

SELECT COUNT(1) FROM actions 
    JOIN client ON (client.id = actions.client_id) 
    WHERE client.token = $token 
    AND WHERE created_at BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW() GROUP BY token; 
+0

@pioter Pasich我沒有使用框架,我已經開發了它的PHP沒有使用框架。當然,我將來會使用一個框架。我可以使用您的解決方案而不使用框架嗎? – hodhod

+0

是的。當然。我更新了我的帖子,以幫助您更多。如果這樣可以解決您的問題,或者有助於將此答案標記爲有用 –

相關問題