试图找到这个答案,但是碰壁了。
代码:(保存为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)从我的网站检索数据。 反之亦然,当我从网络浏览器http://www.url.com/recent.php运行相同的脚本时,它运行得很好,但是无法从命令行找到它?命令行内存缓存结果可以通过$ memcache-> get($ key)在命令行中运行,Web浏览器结果可以通过$ brcwer中的$ 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();从命令和Web浏览器。两者都显示所有3台服务器但是有些值不同,例如curr_items或reclaimed但是大约10个左右。
感觉我错过了一些东西......我可以解决这个问题并将数据保存到MySQL表格中,但这不会回答为什么会发生这种情况的问题。
我试图提供我认为需要的所有信息,但请随时要求澄清。
答案 0 :(得分:1)
运行CLI PHP时,以用户身份运行它。当您通过Apache访问它时,它以apache用户身份运行(www-data或类似)。 memcached实际上关心你的用户名,它会为不同的用户创建不同的缓存。所以你有两个完全独立的缓存。
您可以在Linux上使用sudo ipcs
列出这些缓存,在Shared Memory Segments
下查看。查看“所有者”列,您可能会看到两者。我个人通过运行我的CLI PHP作为www-data用户来解决这个问题:
sudo su www-data -c "php lawl.php"