PHP,Memcached在命令行中可以工作,但在Web中不能工作

11

我已经在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 运行。但是,当我从 web 上运行 index.php 时,它会失败。 我会得到以下错误信息(从网页源代码中查看):

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

除了重新安装操作系统并尝试不同版本的软件,有谁能解释一下可能会导致这个问题的原因吗?


1
php有一个php.ini文件,分别适用于CLI和Web/Apache版本,请确保两者都进行了适当的更改。 - user557846
@wayne - phpinfo() 在 CLI 和 Apache 中都报告了相同的内容。Memcached 已安装,并且在两者中具有相同的参数。 - Fragsworth
我想我只是要重新安装Ubuntu,尽管我更喜欢CentOS,因为它更类似于我们使用的AWS系统。这太耗时了,我需要设置我的环境。谢谢大家。如果有人想到答案,我会让现有的CentOS机器继续运行。我怀疑这可能是libmemcached、Apache和CentOS之间的一个bug。CentOS带有一个非常旧的libmemcached版本,但PHP中的memcached需要手动安装libmemcached 1.0或更高版本。 - Fragsworth
1
我相信@casper123想问的是你是否检查了服务器上安装的多个PHP版本。也许你有一个Apache使用的版本,另一个在CLI中运行 - 也许一个是用yum安装的,另一个是从源代码编译的。 - pilsetnieks
扩展功能正常工作。当它连接到memcached时出现错误。检查您的配置文件(可能在/ etc / sysconfig / memcached或其他位置)并查看是否有主机限制。 - nvanesch
显示剩余11条评论
6个回答

2

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

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

1
哇!这个可行!而且我也不用重新启动。非常感谢! - Finn Haakansson
在我的情况下,
  1. 已确认端口11211已打开
  2. 内存设置足够
  3. Memcache服务器正在运行
  4. PHP可以使用Memcache类。
  5. PHP新建的Memcache未返回其版本并无法设置数据
这对我来说是解决方案!!! 救了我的一天。谢谢。
- Kabkee

2

这是一个 SELinux 的问题吗?命令行可以访问 Memcached,但守护程序不能。请尝试以下操作:

  • getenforce 命令查看是否启用了 SELinux
  • setenforce 0 命令禁用 SELinux
  • reboot 重启系统
  • 重新测试

如果一切正常,您需要配置 Apache 来访问 Memcached。


1
Apache用户可能没有权限或出现了一些奇怪的问题。因此,当通过Apache调用时它无法工作。 - wally

0

我遇到了与OP描述的完全相同的问题。结果发现,问题是由memcached扩展内部维护的服务器列表引起的。我的代码大致如下:

$serversList = $memcached->getServerList();

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

我最初调用测试脚本时,$port的值错误。调用是从Web(Apache)而不是从CLI执行的。在我更正端口并再次运行代码后,它跳过了“if”并使用了现有的服务器列表,该列表存在缺陷,因此又失败了。

从Web中看到失败后,我使用CLI进行了测试,结果完美无缺。在CLI中,服务器列表与Web中的列表不同。实际上,即使我的脚本每次运行都设置它,但在脚本启动时,服务器列表仍为空。但是,在Web上的调用之间,它仍然保持不变。

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


0

我在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()的已加载配置文件在两种情况下报告了不同的值。


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

我怀疑这不是问题 - 假设他是通过CLI在本地Web服务器上运行它。 我猜是SELinux ... 该死的东西! - wally

-1

当当前文件没有定义命名空间时,Memcache\Memcache完全相同。 - rpkamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接