最近发现Zend_Session的DbTable SaveHandler的实现方式并没有针对高性能进行优化,所以,我一直在研究转换到使用Memcache进行会话管理.
我找到一份像样的模式/类从DBTABLE改变了Zend_Session SaveHandler在我引导到MEMCACHE 这里并添加到我的web应用程序.
在我的bootstrap中,我改变了SaveHandler,如下所示:
从:
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Run Code Online (Sandbox Code Playgroud)
至:
Zend_Session::setSaveHandler(new MyApp_Session_SaveHandler_Memcache(Zend_Registry::get("cache")));
Run Code Online (Sandbox Code Playgroud)
所以,我的会话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);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,从该站点提供的类与引导程序中的简单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服务器一致.
请确保包含您制作的任何/所有Zend_Session和/或Zend_Cache配置或您用于实现此功能的其他trickeration或巫术.
谢谢!