【问题标题】:PHP, Memcached works from command line but not from the webPHP,Memcached 从命令行工作,但不能从网络工作
【发布时间】:2013-04-23 01:31:05
【问题描述】:

我在 Centos 6.4 上安装了 PHP 5.3.3,扩展名为 memcached.so,并且 httpd 运行版本为 2.2.15-26。这是我的index.php

$mc = new \Memcached();
$mc->addServer('127.0.0.1', 11211);
$mc->set("test", "blah");
var_dump($mc->getResultCode());
var_dump($mc->getResultMessage());
var_dump($mc->get("test"));
die;

当我从命令行运行它时,它可以工作。我得到以下信息:

10:22:33 $ php index.php
int(0)
string(7) "SUCCESS"
string(4) "blah"

memcache 服务器也可以通过 telnet 工作。但是,当我从网络上运行 index.php 时,它失败了。 我得到以下信息(通过查看网页源):

int(47)
string(51) "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY"
bool(false)

没有重新安装我的操作系统并尝试不同版本的废话,谁能解释可能导致此问题的原因?

【问题讨论】:

  • php 有一个用于 CLI 和 web\Apache 版本的 php.ini 文件,请确保您在两者中都进行了适当的更改
  • 不要忘记重新加载更改
  • @Dagon - /etc/php.ini 文件包含“extension=memcached.so”,CLI 和 Web 都在使用它。如果扩展未安装在 .ini 文件中,我想我会收到“找不到 Memcached”错误...
  • @wayne - 我已经重启了 httpd 并重启了很多次。
  • 我相信@casper123 所问的是您是否检查了您的服务器是否安装了多个 PHP 版本。也许你有一个 Apache 使用的,另一个在 CLI 中运行 - 也许一个安装了yum,另一个是从源代码编译的。

标签: php apache memcached


【解决方案1】:

这是 SELinux 问题吗? Cli 可以访问 Memcached 但没有守护进程。试试这个:

  • getenforce 了解您是否启用了 SELinux
  • setenforce 0 禁用它
  • reboot
  • 重试测试

如果好的话,必须配置Apache才能访问Memcached。

【讨论】:

  • Apache 用户可能没有权限或有些奇怪。因此,当通过 Apache 调用时它不起作用。
【解决方案2】:

我在 CentOS 上遇到了类似的问题,我发现它正在运行 SELinux,这会阻止 httpd 连接到 memcached。你需要在下面设置,

# setsebool -P httpd_can_network_memcache 1
# getsebool httpd_can_network_memcache
httpd_can_network_memcache --> on

【讨论】:

  • 哇!这行得通!而且我也不必重新启动。非常感谢!
  • 就我而言,1. Confirmedport 11211 已打开 2. 内存集足够 3. memcache 服务器正在运行 4. php 可以使用 memcache 类。 5. PHP new memcache没有返回它的版本,设置数据失败这是我的解决方案!!!拯救我的一天。谢谢。
【解决方案3】:

请确保您的 memcache 服务应该绑定所有 IP。默认值为 127.0.0.1。将其更改为 0.0.0.0 以支持所有定义的 Ips。此外,不要忘记控制您的 iptables 或防火墙。

【讨论】:

  • 我怀疑这是问题所在——假设他描述的是通过 CLI 在本地网络服务器上运行它。 SELinux 会是我的猜测......该死的东西!
【解决方案4】:

我在 WAMP 2.4 中遇到了这个问题,在命令行中运行了一个简单的 Memcache 测试脚本,但在浏览器中没有。

结果却是惊人的平凡:WAMP 有两个 php.ini 文件,而我编辑了错误的文件。

例如Apache 使用了这个:c:\wamp\bin\apache\Apache2.4.4\bin\php.ini WAMP 也有这个:c:\wamp\bin\php\php5.4.12\php.ini

将 extension=php_memcache.dll 放入正确的 .ini 文件可修复问题。

我的线索是这样的问题是 phpInfo() 加载的配置文件在两种情况下报告了不同的值。

【讨论】:

    【解决方案5】:

    我遇到了与 OP 描述的完全相同的问题。事实证明,问题是由 memcached 扩展在内部维护的服务器列表引起的。我的代码是这样的:

    $serversList = $memcached->getServerList();
    
    if (empty($serversList)) {
         $memcached->addServer($host, $port);
    }
    

    我对测试脚本的初始调用是使用错误的 $port 值完成的。调用是从 web (apache) 而不是 cli 完成的。在我更正端口并再次运行代码后,它跳过了“if”并使用了存在缺陷的现有服务器列表,因此再次失败。

    从网上看到我用 cli 测试的失败,它运行良好。在 cli 中的服务器列表与 web 中的不同。事实上,服务器列表在脚本每次启动时都是空的,即使我的脚本在每次运行时都设置了它。然而,它在网络上的调用之间持续存在。

    无论如何,在清除网络上的服务器列表并设置正确的服务器后,它也可以在网络上正常工作。

    【讨论】:

      【解决方案6】:

      当我查看示例时,我发现它在没有命名空间“\”修饰符的情况下使用。不用它试试?

      http://www.php.net/manual/en/memcache.examples-overview.php

      <?php
      
      $memcache = new Memcache;
      $memcache->connect('localhost', 11211) or die ("Could not connect");
      

      【讨论】:

      • 当没有为当前文件定义命名空间时Memcache\Memcache完全一样。
      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 2013-08-19
      • 2018-05-04
      相关资源
      最近更新 更多