Zend_Session SaveHandler for Memcache

时间:2010-10-06 07:21:34

标签: zend-framework memcached

最近发现Zend_Session的DbTable SaveHandler的实现方式并没有针对高性能进行优化,因此,我一直在调查转换为使用Memcache进行会话管理。

我发现了一个不错的模式/类,用于将我的引导程序中的Zend_Session SaveHandler从DbTable更改为Memcache here并将其添加到我的Web应用程序中。

在我的bootstrap中,我改变了SaveHandler,如下所示:

FROM:

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

TO:

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

所以,我的会话init看起来像这样:

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更改快速集成,并且它在我的本地dev env中无错误地工作(Web应用程序和内存缓存在同一系统上)。

我还使用PROD中的远程memcache服务器测试了我在本地开发环境中托管的Web应用程序,看看它是如何通过网络执行的,它似乎也可以正常工作。

然而,在我的临时环境(模仿生产)中,我的zend应用程序托管在server1上,而memcache托管在server2上,似乎几乎所有其他请求都完全用特定的错误消息进行轰炸。

我捕获的错误信息包括消息“会话已经由session.auto-start或session_start()启动”,第二个/相关表示Zend_Session :: start()得到一个拒绝连接的错误#8 MemcachePool :: get()“涉及框架文件中的第180行../ Zend / Cache / Backend / Memcached.php。

我已经确认我的php.ini已将session.auto_start设置为0,并且我的代码中唯一的Zend_Session :: start()实例位于我的引导程序中。此外,我在初始化Session之前初始化我的Cache,Db和Helpers(以确保我的Zend_Registry :: get(“cache”)参数用于实例化我的新SaveHandler是有效的。

我发现只有两个宝贵的资源用于如何成功使用Memcache for Zend_Session,我还查看了ZF的Zend_Cache_Backend和Zend_Session“高级用法”文档,但我无法确定使用此错误的原因来源Memcache或为什么它不能与专用/远程memcache服务器一致。

  • 有谁理解这个问题?
  • 有没有人有解决这个问题的经验?
  • 有没有人让他们的ZF网络应用程序中的Memcache以他们可以推荐的方式进行会话管理?

请确保包含您制作的任何/所有Zend_Session和/或Zend_Cache配置或您用于实现此功能的其他任务或巫术。

谢谢!

1 个答案:

答案 0 :(得分:5)

这个几乎让我头晕目眩。

首先,对于一本问题的书感到抱歉......我想描绘一下情况的全貌。不幸的是,我错过了我精彩的同事找到的一些关键细节。

所以,一旦你安装,很可能当你刚刚开始测试deamon时,你会这样做:

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

此命令将启动memcached,在localhost和默认端口11211上使用512MB。

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

我的问题是,我无法让我的网络应用程序与REMOTE memcached服务器一起使用。

因此,当您真正想要启动memcached服务器以接受来自远程系统的请求时,您可以执行以下操作:

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

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

现在,服务器将接受任何对该IP和端口的请求,并按照您的预期进行处理。

Here's a networking doc reference ... RTFM ... 第二次!