Php 限制API请求

Php 限制API请求,php,api,Php,Api,我试图找出限制给定密钥的API请求的最佳方法。基本上,我现在有一个名为counter的表字段,其中每个请求一个,我在前面的值上加1。所以我已经记录了每个请求,但我的问题是,对于一个由n每月请求数确定限制的用户,限制输出的最有效方式是什么 现在我的解决方案是,您只需比较if counter为什么不将计数器存储在单独的表中?或者更好的方法是,使用带有时间戳的访问日志,而不是使用计数器。每次客户端使用您的服务时,只需使用客户端id以及当前日期和时间进行插入即可。然后,您所要做的就是查询COUNT(*)

我试图找出限制给定密钥的API请求的最佳方法。基本上,我现在有一个名为
counter
的表字段,其中每个请求一个,我在前面的值上加1。所以我已经记录了每个请求,但我的问题是,对于一个由
n
每月请求数确定限制的用户,限制输出的最有效方式是什么


现在我的解决方案是,您只需比较
if counter为什么不将计数器存储在单独的表中?或者更好的方法是,使用带有时间戳的访问日志,而不是使用计数器。每次客户端使用您的服务时,只需使用客户端id以及当前日期和时间进行插入即可。然后,您所要做的就是查询
COUNT(*),其中client\u id=5,date\u time>=now()-30天
(或者其他什么。我知道SQL无效,请让我休息一下)。

为什么不将计数器存储在单独的表中?或者更好的方法是,使用带有时间戳的访问日志,而不是使用计数器。每次客户端使用您的服务时,只需使用客户端id以及当前日期和时间进行插入即可。然后,您所要做的就是查询
COUNT(*),其中client\u id=5,date\u time>=now()-30天
(或者别的什么。我知道SQL无效,请让我休息一下)。

您可以使用类似php memcache的东西将与每个键相关联的计数器直接存储在内存中。然后,您可以每天一次将所有值备份到数据库中,以防服务器出现故障,在这种情况下,您会丢失内存中的数据,而您只会丢失一天中的一部分计数

根据您发出的键数,您必须确定这将使用多少内存,以及这是否是一个实用的解决方案

你也可以使用一个中间地带,只缓存每个月达到限制的那些。因此,每当一个键达到它的最大请求计数时,您就在内存中标记它。然后在每个月底,当您重置数据库中的计数时,您也会将它们全部从内存中清除


通过这种方式,您可以向数据库发出请求,直到用户达到限制(因为您正在查询数据库中的请求),然后停止查询表。

您可以使用php memcache之类的工具将与每个键相关联的计数器直接存储在内存中。然后,您可以每天一次将所有值备份到数据库中,以防服务器出现故障,在这种情况下,您会丢失内存中的数据,而您只会丢失一天中的一部分计数

根据您发出的键数,您必须确定这将使用多少内存,以及这是否是一个实用的解决方案

你也可以使用一个中间地带,只缓存每个月达到限制的那些。因此,每当一个键达到它的最大请求计数时,您就在内存中标记它。然后在每个月底,当您重置数据库中的计数时,您也会将它们全部从内存中清除


通过这种方式,您可以向数据库发出请求,直到用户达到限制(因为您正在查询数据库中的请求),然后停止查询表。

可能一个API会被调用“多次”,动态计算命中数会很快变得昂贵。在某个地方增加表中的计数器并定期重置可能要便宜得多。@Marc:insert比select加上更新要便宜得多。你好,克里斯,计数器在一个单独的表中,我知道;这也是我所拥有的,但我正在尝试的是一种不必查询数据库的方式。。但是我想不出有什么是的,但是如果api变得流行,“点击”表将迅速增长,并且进行选择计数(*)将比简单地更新用户表以增加计数器所需的时间要长得多。嗯。。。你给了我很多思考的机会。大概一个API会被“多次”调用,而动态计算点击量会很快变得昂贵。在某个地方增加表中的计数器并定期重置可能要便宜得多。@Marc:insert比select加上更新要便宜得多。你好,克里斯,计数器在一个单独的表中,我知道;这也是我所拥有的,但我正在尝试的是一种不必查询数据库的方式。。但是我想不出有什么是的,但是如果api变得流行,“点击”表将迅速增长,并且进行选择计数(*)将比简单地更新用户表以增加计数器所需的时间要长得多。嗯。。。你让我想了很多。你好,Paul,这种情况是大部分数据缓存了一天,因此没有任何节流工具,对于给定的请求,你只需每隔24小时查询数据库一次数据,其余时间,数据从缓存文件加载。所以我想不出最好的方法来确保给定的请求不超过
n
金额,而每次都不获取计数器值..当我回答时,你只有第1段。。在我发布之前,我没有看到其他3个。Hello Paul,这种情况是大部分数据缓存一天,因此没有任何节流工具,对于给定的请求,您只需每24小时查询一次数据库中的数据,其余时间,数据从缓存文件加载。所以我想不出最好的方法来确保给定的请求不超过
n
金额,而每次都不获取计数器值..当我回答时,你只有第1段。。直到我发帖,我才看到另外3个。。