最近發現Zend_Session的DbTable SaveHandler是以一種對高性能不太優化的方式實現的,所以我一直在研究轉換到使用Memcache進行會話管理。用於Memcache的Zend_Session SaveHandler
我發現一個像樣的模式/類,用於將我的引導程序中的Zend_Session SaveHandler從DbTable更改爲Memcache here,並將其添加到我的Web應用程序中。
在我的引導,我改變了SaveHandler像這樣:
FROM:
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
TO:
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);
因爲你可以s ee,從該站點提供的類快速集成了bootstrap中的一個簡單的loadClass和SaveHandler更改,它可以在我的本地開發環境中正常工作(Web應用程序和memcache在同一個系統上)。
我還測試了我在本地開發環境中使用遠程memcache服務器在PROD中託管的Web應用程序,以瞭解它是如何通過電線執行的,它看起來也可以正常工作。
但是,在我的臨時環境(模仿生產)中,我的zend應用程序託管在server1上,而memcache託管在server2上,似乎幾乎所有其他請求都會通過特定錯誤消息完全彈出。
我捕獲到的錯誤信息包括消息「會話已經由session.auto-start或session_start()啓動」,而第二個/ related表示Zend_Session :: start()獲得了拒絕連接並顯示「Error# 8 MemcachePool :: get()「涉及框架文件../Zend/Cache/Backend/Memcached.php中的第180行。
我已確認我的php.ini已將session.auto_start設置爲0,並且我的代碼中的Zend_Session :: start()的唯一實例在我的引導程序中。此外,我啓動我的緩存,Db和助手之前,我初始化我的會話(以確保我的Zend_Registry :: get(「緩存」)參數實例化我的新SaveHandler是有效的
我發現只有約兩個寶貴的資源如何成功地使用Memcache的Zend_Session和我也審查了ZF的Zend_Cache_Backend和Zend_Session「高級用法」文檔,但我一直無法確定爲什麼我使用Memcache得到這個錯誤的原因或爲什麼它不會與一致專用/遠程內存緩存服務器。
- 沒有人理解這個問題?
- 沒有人有解決這個問題的經驗?
- 有沒有人有他們可以推薦的方式在他們的ZF Web應用程序會話管理中使用Memcache?
請確保包含您所做的任何/所有Zend_Session和/或Zend_Cache配置或您用於獲得此工作的其他任何三輪或巫術。
謝謝!