memcache for php - 无法连接

时间:2013-08-24 15:24:24

标签: php linux apache nginx

我正在运行centos 6.使用apache处理php和nginx来处理脚本图像和css

我已经安装了memcached服务器。

PORT="11211"
USER="memcached"
MAXCONN="4096"
CACHESIZE="512"
OPTIONS="-l 127.0.0.1"

我还安装了php的模块。

我创建了一个新的php文件

 $memcache = new Memcache;
 $memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

我检查了memcached状态并且它正在运行 我总是得到“无法联系” 我试图将值从'127.0.0.1'更改为'localhost' - 仍然无效。

$memcache = new Memcache();
$memcache->addServer('127.0.0.1', 11211) or die ("Could not connect");
var_dump($memcache->getExtendedStats());
$memcache->set('key', 'hello world', false, 60);
echo $memcache->get('key');
//$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

输出

array(1) { ["127.0.0.1:11211"]=> bool(false) }

connect和addServer有什么不同的做法?哪种方法最好?
但我没有得到Hello World

有关代码和此问题的更多更新..

phpinfo 正在显示memcached 后续代码var_dump($ memcache->获得( '键'));给出

bool(false)

为什么我应该使用 addServer 而不是连接

更新代码

$memcache = new Memcache;
$memcache->addServer('localhost', 11211);
echo $memcache->getServerStatus('localhost', 11211);
output : 1

//$memcache->set('key', 'hello world') or die("failed to store data");
output : failed to store data

更多细节

getsebool httpd_can_network_memcache

返回关闭

它应该继续吗?

Notice: Memcache::connect(): Server 127.0.0.1 (tcp 11211, udp 0) failed with: Permission denied (13)

1 个答案:

答案 0 :(得分:7)

如评论中所述,您似乎正在运行安全增强型Linux(SELinux),它在内核级别添加了额外的安全层。根据我的经验和用法,我发现SELinux在某些服务周围添加了一个强制字段,这样他们就无法访问系统上的特定资产。例如,如果我想从/home/src/web提供html内容,我必须告诉系统httpd服务可以访问/home/src/web路径中的内容。为此,我将发出以下命令:

$ -> setsebool -P httpd_enable_homedirs 1

基本上,为了允许服务之间的交叉通信,您必须允许通过策略进行此类访问,就像“锁定”防火墙以允许访问特定端口一样,除了SELinux您不授予对端口的访问权限,而是您准许访问系统的另一部分或服务。幸运的是,我们有几个内置的策略,我们可以使用上面的setsebool构造,而不是试图定义我们自己的策略,这可能是一个痛苦。有关SELinux的更完整说明,请查看wikipedia page

现在回答您的具体问题:

为什么我应该使用addServer而不是connect?

addserver()将允许您将多个ips(或主机名)添加到一个列表中,从该列表中假定存在缓存值,即一个memcache服务器池。而connect()只允许您连接到指定的单个服务器。

getsebool httpd_can_network_memcache,它会返回,是否应该返回?

是的,看起来打开此特定设置将允许您连接到启用了SELinux的内存缓存服务器,但是在我的生产服务器上,我仍然将其设置为关闭,但具有以下设置:

$ -> setsebool -P httpd_can_network_connect 1

我相信,任何一个设置都可以实现目标,但是如果你在另一个主机上有一个memcache服务器,那么httpd仍然可以访问它。

这是一个体面的write-up针对SELinux的允许httpd服务访问其他服务。