-
- [Session]
- ; Handler used to store/retrieve data.
- session.save_handler = files ; 這個預設是session的方式,預設的files即可,表示用文件儲存。
複製程式碼
還有兩種方式,user和memcache。
user方式指的是自己(也就是使用者)定義session的句柄,用於session的存取等,這個可以把session擴充存到資料庫裡。
memcache方式,需要設定好memcache,還要設定session.save_path。
使用memcache來做PHP 的session.save_handler:
-
- ini_set("session.save_handler", "memcache");
- ini_set("session.save_path", "tcp://127.0.0.127.0.127. :11211,tcp://192.168.1.12:11211");
複製代碼
使用memcached 來作PHP 的session.save_handler: 使用memcached 來作PHP 的session.
-
-
- ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.11112127. ;
複製程式碼
下面介紹,PHP實作多伺服器session共享memcache共享的方法。
例子:
自訂session處理機制。
-
-
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
- //======== =====================================
- // 程式: Memcache-Based Session Class
- // 功能: 以Memcache儲存為基礎的Session 功能類別
- //================================== ===========
-
- /**
- * 檔案: MemcacheSession.inc.php
- * 類別名稱: MemcacheSession Class
- * 功能: 自主實作基於Memcache儲存的Session 功能
- * 描述: 這個類別就是實作Session的功能,基本上實作Session的功能,基本上是透過
- * 設定客戶端的Cookie來保存SessionID,
- * 然後把使用者的資料保存在伺服器端,最後透過
- * Cookie中的Session Id來決定一個資料是否是使用者的,
- * 然後進行對應的資料操作
- *
- * 本方式適合Memcache記憶體方式儲存Session資料的方式,
- * 同時如果建構分散式的Memcache伺服器,
- * 能夠保存相當多緩存數據,且適合用戶量比較多並發比較大的情況
- *
- * 注意: 本類必須要求PHP安裝了Memcache擴充或必須有Memcache的PHP API
- * 取得Memcache擴充請訪問: http ://pecl.php.net
- */
-
- //設定SESSION 有效時間,單位是秒
- define('SESS_LIFTTIME' , 3600);
-
- //定義memcache設定資訊
- define('MEMCACHE_HOST', 'localhost');
- define('MEMCACHE_PORT', '10000');
-
- if (!defined('MemcacheSession'))
- {
- define('MemcacheSession', TRUE);
- class MemacheSession
- {
- // {{{ 類別成員屬性定義
- static $mSessSavePath;
- static $mSessName;
- static $mMemcacheObj;
- // }}}
-
- // {{{ 初始化建構子
- /**
- * 構造函數
- *
- * @param string $login_user 登錄用戶
- * @param int $login_type 用戶類型
- * @param string $login_sess 登錄Session值
- * @return Esession
- /**{{{ sessOpen($pSavePath, $name)
- *
- * @param String $pSavePath
- * @param String $pSessName
- *
- * @return Bool TRUE/FALSE public function __construct()
- {
- //我的memcache是以php模組的方式編譯進去的,可以直接呼叫
- //如果沒有,就請自己包含Memcache-client. php 檔案
- if (!class_exists('Memcache') || !function_exists('memcache_connect'))
- {
- die('Fatal Error:Canache not load Memcache extension!')
-
-
- if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
- {
- return false;
- }
- {
- return false;
- }
-
- if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
- {
- die('Fatal Error: Canachefal conmcect to notachenhost. MEMCACHE_HOST .':'. MEMCACHE_PORT);
- }
-
- return TRUE;
- }
- // }}}
-
- /**{{{ sessClose()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */ {{{ sessRead($wSessId)
- *
- * @param String $wSessId
- *
- * @return Bool TRUE/FALSE
- public function sessOpen($pSavePath = '', $pSessName = '')
- {
- self::$mSessSavePath = $pSavePath;
- self::$mSessName = $pSessName TRUE🎜> returnUE ;
- }
- // }}}
-
- /***/
- public function sessClose()
- {
- return TRUE;
- }
- // }}}
-
- /***/
- public function sessRead($wSessId = '')
- {
- $wData = self::$mMeacheOb::$mMeacheObj- >get($wSessId);
-
- //先讀取數據,如果沒有,就初始化一個
- if (!empty($wData))
- {
- return $wData;
- }
- else
- {
- //初始化一空記錄
- $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
- if ( TRUE != $ret)
- {
- die("Fatal Error: Session ID $wSessId init failed!");
- return FALSE;
- }
- return TRUE ; 🎜> }
- // }}}
-
- /**{{{ sessWrite($wSessId, $wData)
- *
- * @param String $wSessId
- * @param String $wData
- *
- * @return Bool TRUE/FALSE
- */
- public function sessWrite($wSessId = '', $wData = '')
- {
- $ret = self::$mMeacheObj-> replace($wSessId, $wData, 0, SESS_LIFTTIME);
- if (TRUE != $ret)
- {
- die("Fatal Error: SessionID $wSessId Save data failed!"); return FALSE;
- }
- return TRUE;
- }
- // }}}
-
- /**{{{ sessDestroy($wSessId)
- *
- * @param String $wSessId
- *
- * @return Bool TRUE/FALSE
- */
- public function sessDestroy($wSessId = ' ')
- {
- self::sessWrite($wSessId);
- return FALSE;
- }
- // }}}
-
- /**{{{ sessGc()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */
- public function sessGc()
- {
- //無額外回收,memcache有自己的過期回收機制
- return TRUE;
- }
- // }}}
- /**{{{ initSess()
- *
- * @param NULL
- *
- * @return Bool TRUE/FALSE
- */
- public function initSess()
- {
- //不使用GET/POST 變數方式
- ini_set('session.use_trans_sid', 0); >
- //設定垃圾回收最大生存時間
- ini_set('session.gc_maxlifetime', SESS_LIFTTIME);
-
- //使用COOKIE 儲存SESSION ID 的方式
- ini_set('session.use_cookies ', 1);
- ini_set('session.cookie_path', '/');
-
- $domain = '.imysql.cn';
- //多主機共享保存SESSION ID 的COOKIE
- ini_set('session.cookie_domain', $domain);
-
- //將session.save_handler 設定為user,而不是預設的files
- session_module_name('user'); 🎜> //定義SESSION 各項操作所對應的方法名稱:
- session_set_save_handler(
- array('MemacheSession', 'sessOpen'), //對應於靜態方法My_Sess::open(),下同。
- array('MemacheSession', 'sessClose'),
- array('MemacheSession', 'sessRead'),
- array('MemacheSession', 'sessWrite'),
- array('MemacheSession', 'sessWache'),
- array('MemacheSession', 'sessWache'), array('MemacheSession', 'sessGc')
- );
-
- session_start();
- return TRUE;
- }
- }
- return TRUE;
- }
- } }}
- }//end class
- }//end define
-
- $memSess = new MemacheSession;
- $memSess->initSess();
- ?>
複製程式碼
在程式中的頭檔中直接包含MemacheSession.inc.php 即可使用該類別。
測試實例。
1,建立一個session
-
-
-
//set_session.php
- session_start();
- if (!isset($_SESSION['admin' ])) {
- $_SESSION['TEST'] = 'wan';
- }
- print $_SESSION['admin'];
- print "/n";
- print session_id( );
?>
複製程式碼
2,用sessionid到memcached中查詢:
-
-
-
//get_session.php
- $mem = new Memcache;
- $mem->connect("127.0. 0.1", 11211);
- var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
?>
比如:
session.save_handler = memcache
session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"
|