【问题标题】:Memcache php cli vs apache using different caches?Memcache php cli vs apache使用不同的缓存?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 小精灵? :) 我遇到了同样的问题,但我什至无法使用 1 台服务器。简单的解释是“我的答案是错误的”,但我想看看ipcs 的输出;这太像我的问题了,我很容易相信这不是同一个问题。 :)
猜你喜欢
  • 2010-11-14
  • 2014-02-13
  • 2022-01-23
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2012-09-06
相关资源
最近更新 更多