限制发送到服务器的客户端请求的数量

时间:2017-02-14 07:06:24

标签: php mysql apache api nusoap

我有API PHPnusoap,它在具有Apache网络服务器的服务器上启动。不同的远程客户端向我的API函数发送请求并获得响应。我想以这种方式将客户端请求限制为特定功能:

客户端可以每秒发送的请求存在限制,此限制存储在mysql数据库中。每个客户端必须能够发送请求,直至其限制。例如,如果为客户端定义的最大请求数为300,则不允许在第二个时间内发送超过300个请求。

如何使用PHP或Apache实现此规则?

1 个答案:

答案 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;