Memcache PHP CLI和Apache使用不同的缓存吗?

4

我一直在寻找这个答案,但是一直碰壁。

代码:(保存为recent.php)

$MEMCACHE_SERVERS = array(
    "1.2.3.4", //db prodmaster
    "5.6.7.8",  //db prodslave1
    "9.10.11.12" //db1 dev
);

$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer($server,11211);
}
$key = "rec_obj_".$cat_id;
$memcache->delete($key);
$memcache->set($key, $objects, MEMCACHE_COMPRESSED, $time=60*60*4);

给定以上代码,为什么在从cli和apache运行时会访问不同的缓存?当我从命令行运行php /var/www/localhost/htdocs/url/recent.php时,它可以完美运行,但是我无法通过$memcache->get($key)从我的网站检索数据。
反之,当我从Web浏览器http://www.url.com/recent.php 运行相同的脚本时,它可以完美运行,但是无法从命令行找到? 命令行memcache结果可以通过在命令行中运行 $memcache->get($key) 找到,Web浏览器结果可以通过$memcache->get($key)从Web浏览器找到。 CLI和Web缓存似乎是分开的,我该如何解决?
我已经检查了我的phpinfo(),php-apache2和php-cli都有extension=memcache.so。此外,我认为可能是哈希差异,但两者都显示:
Directive               Local Value Master Value
memcache.allow_failover 1   1
memcache.chunk_size 8192    8192
memcache.default_port   11211   11211
memcache.default_timeout_ms 1000    1000
memcache.hash_function  crc32   crc32
memcache.hash_strategy  consistent  consistent
memcache.max_failover_attempts  100 100

我也尝试输出状态并从命令和Web浏览器检查$memcache->getExtendedStats();。两者都显示所有3个服务器。但有些值是不同的,如curr_items或reclaimed,但相差约10个左右。

感觉我错过了什么...我可以制作一个解决方法,将数据保存到MySQL表中,但这不会回答为什么会发生这种情况的问题。

我已经尽力提供我认为需要的所有信息,但请随时要求澄清。


假设$cat_id是提供的整数。在两个环境中都相同,不是问题所在。 - Anthony Lin
2
如果您告诉它只使用其中一个服务器,会发生什么? - Charles
1
很好的发现,当只使用一个服务器时,它似乎可以工作。这将缩小问题范围,要么是在cli与apache中分配slab不同,要么是其中一个未能正确访问所有3个服务器。我会调查一下。感谢你的帮助。 - Anthony Lin
1
这可能比那更隐匿。尝试独立使用每个服务器,也许其中一个一直在做一些不正确的事情。很高兴这有所帮助! - Charles
1
服务器是否按照相同顺序添加?这似乎很重要(我通常在调用“addServer”之前按字母顺序排序IP ...)。 - Wrikken
显示剩余2条评论
1个回答

1

当您运行CLI PHP时,它会作为您的用户运行。当您通过Apache访问它时,它将作为apache用户(www-data或类似用户)运行。memcached实际上关心您的用户名,它将为不同的用户创建不同的缓存。因此,您有两个完全独立的缓存。

您可以使用Linux上的sudo ipcs列出这些缓存,在共享内存段下查看。检查“所有者”列,您可能会看到两个。我个人通过将我的CLI PHP作为www-data用户运行来解决这个问题:

sudo su www-data -c "php lawl.php"

小精灵?:) 我遇到了同样的问题,只是我连一个服务器都无法正常工作。简单的解释就是“我的答案是错的”,但我想看一下ipcs的输出;它太完美地符合我的问题,我很难相信它不是同一个问题。:) - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接