2015-11-07 23 views
0

我碰到了一个泡菜。通常我可以通过一些大量的谷歌搜索(到正确的SO线程)找到解决我的问题的方法,但现在还没有。可以同时从多个脚本更新和检查的变量

我正在使用一个API,它允许我通过cURL访问其数据,并且此API每10分钟有500个请求的请求限制。如果此限制反复超出,您的API密钥将被暂停。

我用PHP编写的应用程序经常通过不同的页面发出请求 - 有时会同时发生。我需要一个解决方案来确保我始终处于请求限制之下。我需要能够同时检查和更新每10分钟重置一次的变量。 这甚至可以完成?我应该如何处理这个问题?

我并不是要求源代码达到完美的解决方案,我只是想指出如何解决这个问题,或者如果解决不了问题 - 替代方法是什么?

预先感谢您。

+0

一个执行curl请求的队列和中心点,每当你发出请求时都会有一个数据库的日期,然后count(*)'行数,一个带有排它锁的文件。 – Sumurai8

+0

您是多次获取相同的数据还是总是不同?我使用缓存机制:检查请求是否存在缓存文件;如果未过期(比10分钟早),则返回缓存的数据;否则发出请求并将其存储在一个文件中。 – Kenney

回答

1

听起来像memcache是你在找什么。它可以保存诸如PHP对象或基本类型的变量,并给它们以及过期日期。只需谷歌的PHP的memcached扩展和看看这里:http://php.net/manual/en/class.memcache.php

Furhermore,它可以通过TCP访问并具有一些故障转移功能。 AWS提供的服务与调用它的memcache API兼容ElastiCache

+0

我目前正在研究MySQL解决方案,因为我现在只是一个业余爱好开发人员,但我仍然对使用'memcache'方法而不是MySQL的好处是什么? –

+0

当使用数据库时,您需要处理客户端到期的东西,显然只需要存储10分钟内的易失性数据就会产生巨大的开销。内存缓存很快,一旦到期,变量就会“消失”。 –

1

如果页面由不同的用户运行,那么我只能想到的是存储在表中。

这样做

$datestring = substr(date("Y-m-d H:i"),0, -1); 

这样你有分钟2016年11月7日17:00:00总是相同的字符串 - 2016年11月7日17时09分59秒。

然后在一个表中存储与此机制:

"INSERT INTO table (datestring, count) VALUES ('$datestring', '1') ON DUPLICATE KEY UPDATE count = count + 1"; 

当然把datestring CHAR(15)作为一个独特的密钥。

你用一个选择的FROM ...检查你的计数。比较刚刚创建的日期字符串,并且你没有得到任何行或计数值的行。

这是一个解决方案,当然有很多。

+0

谢谢你的回答!我已经用这种方法做了一个快速解决方案,目前它似乎工作正常,尽管我只在本地进行了测试。希望我明天有时间在公共服务器上进行一些广泛的测试。 –

+0

考虑同时添加时间戳,每次使用apikey一行,timestamp以秒为单位,所以在mysql中有如timevalue> CURRENT_TIMESTAMP - 600是10分钟前。 – AndreaBogazzi

相关问题