我有API
PHP
和nusoap
,它在具有Apache
网络服务器的服务器上启动。不同的远程客户端向我的API函数发送请求并获得响应。我想以这种方式将客户端请求限制为特定功能:
客户端可以每秒发送的请求存在限制,此限制存储在mysql
数据库中。每个客户端必须能够发送请求,直至其限制。例如,如果为客户端定义的最大请求数为300,则不允许在第二个时间内发送超过300个请求。
如何使用PHP或Apache实现此规则?
答案 0 :(得分: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;