2012-01-16 62 views
4

试图找遍这个答案,但打墙。Memcache php cli vs apache使用不同的缓存?

代码:(保存为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)在命令行中运行命令行memcache结果,通过web broswer中的$ memcache-> get($ key)可以找到web浏览器结果。 CLI和Web缓存似乎是分开的,我该如何解决这个问题?

我检查我的phpinfo(),php-apache2和php-cli都有扩展名= 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或回收,但关闭了10左右。

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

我试图提供所有我认为需要的信息,但随时可以要求澄清。

+0

假设$ cat_id是一个提供的整数。在两种环境中都是一样的,而不是问题。 – 2012-01-16 18:56:36

+2

如果您告诉它只使用三台服务器中的一台,会发生什么? – Charles 2012-01-17 01:07:52

+1

良好的捕获,当只使用1台服务器,它似乎工作。将其缩小为分配cli与apache不同的平板,或者一个无法正确访问全部3台服务器。我会研究这个。感谢您的支持。 – 2012-01-17 17:29:00

回答

1

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

您可以在Linux上使用sudo ipcs列出这些缓存,查看Shared Memory Segments。查看“所有者”专栏,您可能会看到两者。我个人通过运行我的CLI PHP作为www数据用户来解决这个问题:

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

但为什么它似乎与1台服务器一起工作? – 2012-04-05 08:40:38

+0

Gremlins? :)我有同样的问题,除了我无法让它与1台服务器一起工作。简单的解释是“我的答案是错误的”,但我想看看'ipcs'的输出;这太完美了,就像我的问题一样,我轻易相信这不是同一个问题。 :) – Mike 2012-04-05 08:48:14