Memcached PHP客户端库错误?

Memcached PHP客户端库错误?,php,ubuntu,memcached,Php,Ubuntu,Memcached,很长一段时间以来,我一直在使用PHP5.2、Apache 2.2和memcached 1.2.6,在许多主机上进行客户端分片。这已经很有效了。最近,我开始将memcached客户端升级到PHP5.3。这来自ubuntu服务器10.04 LTS。 然而,我开始看到一个奇怪的bug,其中一些其他键的值返回,比如说每100000000个请求返回一次(据我所知)。我还不能确定这是否会破坏存储或加载(调试发生在数据过期之后)。 从get返回的损坏数据有时是来自完全不同的键的值,有时也是该键应该具有的数组值

很长一段时间以来,我一直在使用PHP5.2、Apache 2.2和memcached 1.2.6,在许多主机上进行客户端分片。这已经很有效了。最近,我开始将memcached客户端升级到PHP5.3。这来自ubuntu服务器10.04 LTS。 然而,我开始看到一个奇怪的bug,其中一些其他键的值返回,比如说每100000000个请求返回一次(据我所知)。我还不能确定这是否会破坏存储或加载(调试发生在数据过期之后)。 从get返回的损坏数据有时是来自完全不同的键的值,有时也是该键应该具有的数组值中的单个元素。 在网上搜索没有明显提到这些症状,但这是一个很难找到答案的搜索,因为大多数讨论都与应用程序级别的竞争条件bug有关。我已经向自己证明,这不是其中之一

那么,这是堆栈中某个已知的bug吗?还有其他有类似经历的人吗?提前谢谢

要回答一些问题:

  • 是的,这是一个旧版本。很长一段时间以来,它一直运转良好。因此,我不认为是服务器出了问题(但我想可能是)。我们尝试升级到1.4.5,但测试失败,因为我们依赖于旧版memcache的某些行为,这些行为在升级时被不兼容地更改。解决这个问题将在未来发生,但你知道一句谚语:如果它没有坏

  • 每个分片服务器机器(以及PHP客户端)都有8 Gig的ECC RAM,因此我们可以知道是否有内存故障

  • 我所说的另一个键的值是,如果我将一组电子邮件地址存储到一个名为“email_addresses_$id”的键中,则很少有人会在稍后读回该键时返回,例如,一个Python pickle dict产品id,这些id只会通过完全不同的代码存储到一个名为“product_ids_$serial”的键中。此外,我们很少会返回单个电子邮件地址,而不是完整的电子邮件地址数组(或预期的单个电子邮件地址数组)


另外:我估计我们每天的memcached流量超过了1 TB,因此记录所有流量以便能够返回并调试每月出现一到三次的故障时发生的情况是不太可能的。

很可能这是一个密钥冲突问题,在将密钥发送到memcached之前是否使用特殊哈希


升级到最新的PHP是否导致方法/函数意外返回?打开所有错误并观察错误。

我们已经能够重现此问题

如果到memcached的连接失败,那么PHP memcached客户端库版本3将失败。它返回一个错误,但将上一个请求的数据排入队列。进入库的下一个请求将导致打开新连接,然后使用新请求中的密钥,但使用旧请求中的数据


我知道这听起来很疯狂,但它是完全可复制的。

其他键的值是什么意思?这是一个oooold版本的memcached。当您尝试升级到1.4.5时,bug会消失吗?如果失败,您是否在该机器上进行了任何内存测试?关键是实际的唯一字符串。我们的API使用是犹太的。但是,我们不能在生产过程中打开通知,因为我们的请求量太大,而且网站不完全没有通知。如果代码中没有错误,应该没有噪音,如果有噪音,您发现了问题,可以获得5分钟的样本并将其关闭。最后一次计数,这个代码库是以php4开头的数百万行代码,注意事项(“数组中未定义索引blah…”)实际上并不是生产中的bug。他们也没有告诉我memcache客户端库失败的原因。在最好的世界里,我们有无限的工程时间来修复这些通知,但这不是我们生活的世界。你可以把这些错误消除掉。。。。没有千篇一律的解决办法。如果您遇到冲突,这将是调试的第一件事。我们也有同样的问题。memcache有时会为同一个键返回不同的值。这在一天内发生了几次。我们有4台memcache服务器。也许我们也有同样的问题,你认为你可以给我一个脚本,如果你有一些,如何复制或指导如何尝试它?你使用pconnect功能吗?尝试使用connect而不是