Zend_Session Memcache存储处理程序

4

最近发现Zend_Session的DbTable SaveHandler实现方式不太适合高性能,因此,我一直在研究改用Memcache进行会话管理。

我在我的引导程序中找到了一个不错的模式/类,可以将Zend_Session SaveHandler从DbTable更改为Memcachehere,并将其添加到我的Web应用程序中。

在我的引导程序中,我像这样更改了SaveHandler:

FROM:

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));

致:

Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));

所以,我的会话初始化看起来像这样:

Zend_Loader::loadClass('MyApp_Session_SaveHandler_Memcache');
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));
Zend_Session::start();
// set up session space
$this->session = new Zend_Session_Namespace('MyApp');
Zend_Registry::set('session', $this->session);

正如您所看到的,该网站提供的类可以通过简单的loadClass和SaveHandler更改快速集成,并且在我的本地开发环境中运行良好(Web应用程序和Memcache在同一系统上)。我还使用远程Memcache服务器在本地开发环境中测试了我的Web应用程序,以查看它在网络上传输时的性能,并且似乎也可以正常工作。然而,在模仿生产环境的演示环境中,我的Zend应用程序托管在server1上,而Memcache托管在server2上,几乎每个其他请求都会完全失败,并显示特定的错误消息。我捕获的错误信息包括“session has already been started by session.auto-start or session_start()”的消息,第二个/相关的指示Zend_Session::start()在框架文件../Zend/Cache/Backend/Memcached.php的第180行出现了一个“Error #8 MemcachePool::get() Connection Refused”的错误。我已确认我的php.ini将session.auto_start设置为0,并且我代码中唯一使用Zend_Session :: start()的实例是在我的引导程序中。此外,我在初始化我的会话之前初始化了我的缓存、数据库和助手(以确保我的Zend_Registry :: get(“cache”)参数用于实例化我的新SaveHandler是有效的)。
我只发现了两个有价值的资源,介绍如何成功地使用Memcache进行Zend_Session,并且我还查阅了ZF的Zend_Cache_Backend和Zend_Session“高级用法”文档,但我无法确定为什么我在使用Memcache时会遇到此错误,或者为什么它不能与专用/远程Memcache服务器一起正常工作。
  • 有人理解这个问题吗?
  • 有人解决过这个问题吗?
  • 有人在他们的ZF Web应用程序中使用Memcache来管理会话的方式可以推荐吗?
请确保包括您所做的任何/所有Zend_Session和/或Zend_Cache配置,或其他您用于使其正常工作的技巧或巫术。
谢谢!
1个回答

5

这个问题几乎让我崩溃了。

首先,抱歉我的问题有点长……但是我想要完整地描述情况。不幸的是,我错过了一些关键细节,而我的出色的同事找到了它们。

因此,在安装后,当您刚开始测试守护程序时,您将执行以下操作:

root# memcached -d -u nobody -m 512 127.0.0.1 -p 11211

这个命令将启动memcached,在本地主机上使用512MB和默认端口11211。

你看到我做了什么吗?这意味着它只设置为处理发送到LOOPBACK网络接口的请求。

我的问题是,我无法使我的Web应用程序与远程memcached服务器配合工作。

所以,当您实际上想要启动您的memcached服务器以接受来自远程系统的请求时,您会执行类似以下的操作:

root# memcached -d -u nobody -m 512 -l 192.168.0.101 -p 11211

这解决了我的问题。这启动了我的memcached守护程序,将其设置为使用512MB绑定到IP 192.168.0.101并侦听默认端口11211。

现在,任何发送到该IP和端口的请求都将被服务器接受并处理,就像您所期望的那样。

这里是一个网络文档参考……RTFM…再看一遍!


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