【发布时间】:2012-01-16 18:55:06
【问题描述】:
试图到处寻找这个答案,但碰壁了。
代码:(另存为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 broswer 中的 $memcache->get($key) 找到。 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
也尝试过输出状态和检查 $memcache->getExtendedStats();从命令和网络浏览器。两者都显示所有 3 台服务器。但是有些值是不同的,例如 curr_items 或 reclaimed 但相差 10 左右。
感觉好像我遗漏了一些东西。我可以做一个变通方法并将数据保存到 MySQL 表中,但这不能回答为什么会发生这种情况的问题。
我已尝试提供我认为需要的所有信息,但请随时要求澄清。
【问题讨论】:
-
假设 $cat_id 是一个提供的整数。在两种环境中都相同,而不是问题。
-
如果你告诉它只使用三个服务器中的一个会发生什么?
-
很好,当只使用一台服务器时,它似乎可以工作。将其缩小为在 cli 与 apache 中分配不同的平板,或者无法正确访问所有 3 台服务器。我会调查一下。感谢您的支持。
-
它可能比这更阴险。尝试独立使用每台服务器,也许有人一直在做不正确的事情。很高兴这有帮助!
-
服务器添加的顺序是否相同?这似乎有所不同(我倾向于在调用
addServer...之前按字母顺序对 IP 进行排序)。
标签: php apache memcached command-line-interface