2010-10-06 22 views
4

最近發現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配置或您用於獲得此工作的其他任何三輪或巫術。

謝謝!

回答

5

這只是幾乎爆炸了我的頭。

首先,對於一本問題的書感到抱歉...我想描繪一幅完整的情況。不幸的是,我錯過了我的美妙同事發現的幾個關鍵細節。

所以,一旦你安裝,最有可能當你剛剛開始測試出守護程序,你會做到這一點:

根#memcached的-d -u -m無人127.0.0.1 512 -p 11211

此命令將啓動memcached,在本地主機上使用512MB,默認端口爲11211.

您是否看到我在那裏做了什麼?這意味着它只能處理髮送到LOOPBACK網絡接口的請求。

我的問題是,我不能讓我的web應用程序與遠程服務器的memcached工作。

所以,當你真正要啓動你的memcached服務器接受來自遠程系統的請求,在執行類似如下:

根#memcached的-d -u無人-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 ... 第二次!