PHP脚本在从memcached获取时因过期而死亡

时间:2014-03-15 22:42:27

标签: php memcached

我的情况是我需要从网站的API快速而频繁地更新。 (我已经问过他们我能用多快的速度敲打他们,并且他们已经按你喜欢的速度说了。)

所以我的设计架构是创建几个小型快速运行的PHP脚本,它们执行非常具体的操作,将结果保存到memcache,然后重复。因此,第一个脚本通过其API获取单个数据并将其存储在memcache中,然后再次询问。第二个脚本处理存储在memcache中的第一个脚本的数据,并根据该处理的结果从API请求另一个数据。第三个使用第二个结果,对数据做了一些事情,通过API请求更多数据,直到决定通过他们的API执行。

我在具有24 GB RAM和8个内核的计算机上并行运行这些脚本。我也在使用主管来管理它们。

当我通过CLI或浏览器手动运行每个PHP脚本时,它们工作正常。他们不会死,除非我告诉他们浏览器,所以我可以得到一些反馈。逻辑很好,脚本运行正常等等。

然而,当我让他们无限运行vai supervisor时,日志填满了最大执行时间到达错误,它指向的行是我的一个类中的行,它从memcache获取数据。有时它会检查数据是否为JSON(它应该始终是JSON),有时它会在同一个函数/方法中的其他地方炸弹。为Supervisor托管脚本设置的超时为5秒,因为那时数据已失效。

我考虑过提高执行时间,但

  • 数据将在那时过时,
  • memcache通常在不到1毫秒内返回,因此5秒是永恒的,
  • 当手动(CLI或浏览器)运行时,没有任何脚本因超时而失败

环境: Ubuntu 12.04服务器 带有Suhosin-Patch的PHP 5.3.10-1unbuntu3.9 Memcached 1.4.13 主管??

Memcache Stats(来自phpMemcachdAdmin):

Size: 1 GB
Uptime: 17 hrs, 38 min
Hit Rate: 76.5%
Used: 18.9 MB
Wasted: 18.9 MB
Bytes Written: 307.8 GB
Bytes Read: 7.2 GB

这是一个截图: phpMemcachedAdmin Screen Capture

---------------其他想法/问题----------------

我不认为在我的原始帖子中很清楚,为了获得快速更新,我正在运行多个副本,并获取API数据的脚本。因此,如果一个脚本抓取基本帐户数据寻找更改以触发另一个事件,那么我实际上至少有两个实例同时运行。这是因为我最大的风险因素是过时的数据导致延迟决策以及API的1秒响应时间。

因此,我发现问题可能源于写入冲突,其中同一脚本的2个实例正在尝试写入同一缓存键。我最初的谷歌搜索没有导致任何关于memcache中可能的写冲突/冲突的好材料。然而,更深入的下潜提供了一个页面,其中有一个由1个memcache实例的Elgg驱动的2个书签站点的用户遇到了他所描述的冲突。

当我决定同时关闭多个实例时,我最初的假设是,主管会以顺序的方式启动它们,因此会略微交错(可能是一个不好的假设,我是使用Supervisor的新手)。此外,API将以不同的速率响应每个呼叫。因此,在亚毫秒时间帧内的写入时间和每1-2秒一次的更新,写入冲突/冲突的可能性似乎很低。

我考虑使用某种形式的前缀/后缀和键。每个实例都已经拥有了自己的md5哈希创建的实例ID。所以我可以使用前缀或后缀,然后让每个实例都写入自己的密钥。但后来我需要另一个密钥来保存所有这些前缀/后缀键。所以现在我正在进行多次缓存提取,循环遍历所有存储的数据,并丢弃除了其中一个结果之外的所有数据。我打赌那里有一个更好/更快的架构...

我正在添加代码来完成Aziz现在要求的时间。添加代码并收集数据需要一些时间。

建议欢迎

0 个答案:

没有答案