2017-02-14 199 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

是的。当然。我更新了我的帖子,以帮助您更多。如果这样可以解决您的问题,或者有助于将此答案标记为有用 –

相关问题