首頁  >  文章  >  後端開發  >  php使用memcache實作多伺服器共享session

php使用memcache實作多伺服器共享session

WBOY
WBOY原創
2016-07-25 08:56:061057瀏覽
  1. [Session]
  2. ; Handler used to store/retrieve data.
  3. session.save_handler = files ; 這個預設是session的方式,預設的files即可,表示用文件儲存。
複製程式碼

還有兩種方式,user和memcache。 user方式指的是自己(也就是使用者)定義session的句柄,用於session的存取等,這個可以把session擴充存到資料庫裡。 memcache方式,需要設定好memcache,還要設定session.save_path。

使用memcache來做PHP 的session.save_handler:

  1. ini_set("session.save_handler", "memcache");
  2. 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.
  1. ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.11112127. ;
複製程式碼

下面介紹,PHP實作多伺服器session共享memcache共享的方法。 例子: 自訂session處理機制。

  1. /* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
  2. //======== =====================================
  3. // 程式: Memcache-Based Session Class
  4. // 功能: 以Memcache儲存為基礎的Session 功能類別
  5. //================================== ===========
  6. /**
  7. * 檔案: MemcacheSession.inc.php
  8. * 類別名稱: MemcacheSession Class
  9. * 功能: 自主實作基於Memcache儲存的Session 功能
  10. * 描述: 這個類別就是實作Session的功能,基本上實作Session的功能,基本上是透過
  11. * 設定客戶端的Cookie來保存SessionID,
  12. * 然後把使用者的資料保存在伺服器端,最後透過
  13. * Cookie中的Session Id來決定一個資料是否是使用者的,
  14. * 然後進行對應的資料操作
  15. *
  16. * 本方式適合Memcache記憶體方式儲存Session資料的方式,
  17. * 同時如果建構分散式的Memcache伺服器,
  18. * 能夠保存相當多緩存數據,且適合用戶量比較多並發比較大的情況
  19. *
  20. * 注意: 本類必須要求PHP安裝了Memcache擴充或必須有Memcache的PHP API
  21. * 取得Memcache擴充請訪問: http ://pecl.php.net
  22. */
  23. //設定SESSION 有效時間,單位是秒
  24. define('SESS_LIFTTIME' , 3600);
  25. //定義memcache設定資訊
  26. define('MEMCACHE_HOST', 'localhost');
  27. define('MEMCACHE_PORT', '10000');
  28. if (!defined('MemcacheSession'))
  29. {
  30. define('MemcacheSession', TRUE);
  31. class MemacheSession
  32. {
  33. // {{{ 類別成員屬性定義
  34. static $mSessSavePath;
  35. static $mSessName;
  36. static $mMemcacheObj;
  37. // }}}
  38. // {{{ 初始化建構子
  39. /**
  40. * 構造函數
  41. *
  42. * @param string $login_user 登錄用戶
  43. * @param int $login_type 用戶類型
  44. * @param string $login_sess 登錄Session值
  45. * @return Esession
  46. /**{{{ sessOpen($pSavePath, $name)
  47. *
  48. * @param String $pSavePath
  49. * @param String $pSessName
  50. *
  51. * @return Bool TRUE/FALSE public function __construct()
  52. {
  53. //我的memcache是​​以php模組的方式編譯進去的,可以直接呼叫
  54. //如果沒有,就請自己包含Memcache-client. php 檔案
  55. if (!class_exists('Memcache') || !function_exists('memcache_connect'))
  56. {
  57. die('Fatal Error:Canache not load Memcache extension!')
  58. if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
  59. {
  60. return false;
  61. }
  62. {
  63. return false;
  64. }
  65. if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
  66. {
  67. die('Fatal Error: Canachefal conmcect to notachenhost. MEMCACHE_HOST .':'. MEMCACHE_PORT);
  68. }
  69. return TRUE;
  70. }
  71. // }}}
  72. /**{{{ sessClose()
  73. *
  74. * @param NULL
  75. *
  76. * @return Bool TRUE/FALSE
  77. */ {{{ sessRead($wSessId)
  78. *
  79. * @param String $wSessId
  80. *
  81. * @return Bool TRUE/FALSE
  82. public function sessOpen($pSavePath = '', $pSessName = '')
  83. {
  84. self::$mSessSavePath = $pSavePath;
  85. self::$mSessName = $pSessName TRUE🎜> returnUE ;
  86. }
  87. // }}}
  88. /***/
  89. public function sessClose()
  90. {
  91. return TRUE;
  92. }
  93. // }}}
  94. /***/
  95. public function sessRead($wSessId = '')
  96. {
  97. $wData = self::$mMeacheOb::$mMeacheObj- >get($wSessId);
  98. //先讀取數據,如果沒有,就初始化一個
  99. if (!empty($wData))
  100. {
  101. return $wData;
  102. }
  103. else
  104. {
  105. //初始化一空記錄
  106. $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
  107. if ( TRUE != $ret)
  108. {
  109. die("Fatal Error: Session ID $wSessId init failed!");
  110. return FALSE;
  111. }
  112. return TRUE ; 🎜> }
  113. // }}}
  114. /**{{{ sessWrite($wSessId, $wData)
  115. *
  116. * @param String $wSessId
  117. * @param String $wData
  118. *
  119. * @return Bool TRUE/FALSE
  120. */
  121. public function sessWrite($wSessId = '', $wData = '')
  122. {
  123. $ret = self::$mMeacheObj-> replace($wSessId, $wData, 0, SESS_LIFTTIME);
  124. if (TRUE != $ret)
  125. {
  126. die("Fatal Error: SessionID $wSessId Save data failed!"); return FALSE;
  127. }
  128. return TRUE;
  129. }
  130. // }}}
  131. /**{{{ sessDestroy($wSessId)
  132. *
  133. * @param String $wSessId
  134. *
  135. * @return Bool TRUE/FALSE
  136. */
  137. public function sessDestroy($wSessId = ' ')
  138. {
  139. self::sessWrite($wSessId);
  140. return FALSE;
  141. }
  142. // }}}
  143. /**{{{ sessGc()
  144. *
  145. * @param NULL
  146. *
  147. * @return Bool TRUE/FALSE
  148. */
  149. public function sessGc()
  150. {
  151. //無額外回收,memcache有自己的過期回收機制
  152. return TRUE;
  153. }
  154. // }}}
  155. /**{{{ initSess()
  156. *
  157. * @param NULL
  158. *
  159. * @return Bool TRUE/FALSE
  160. */
  161. public function initSess()
  162. {
  163. //不使用GET/POST 變數方式
  164. ini_set('session.use_trans_sid', 0); >
  165. //設定垃圾回收最大生存時間
  166. ini_set('session.gc_maxlifetime', SESS_LIFTTIME);
  167. //使用COOKIE 儲存SESSION ID 的方式
  168. ini_set('session.use_cookies ', 1);
  169. ini_set('session.cookie_path', '/');
  170. $domain = '.imysql.cn';
  171. //多主機共享保存SESSION ID 的COOKIE
  172. ini_set('session.cookie_domain', $domain);
  173. //將session.save_handler 設定為user,而不是預設的files
  174. session_module_name('user'); 🎜> //定義SESSION 各項操作所對應的方法名稱:
  175. session_set_save_handler(
  176. array('MemacheSession', 'sessOpen'), //對應於靜態方法My_Sess::open(),下同。
  177. array('MemacheSession', 'sessClose'),
  178. array('MemacheSession', 'sessRead'),
  179. array('MemacheSession', 'sessWrite'),
  180. array('MemacheSession', 'sessWache'),
  181. array('MemacheSession', 'sessWache'), array('MemacheSession', 'sessGc')
  182. );
  183. session_start();
  184. return TRUE;
  185. }
  186. }
  187. return TRUE;
  188. }
  189. } }}
  190. }//end class
  191. }//end define
  192. $memSess = new MemacheSession;
  193. $memSess->initSess();
  194. ?>
複製程式碼

在程式中的頭檔中直接包含MemacheSession.inc.php 即可使用該類別。

測試實例。 1,建立一個session
  1. //set_session.php
  2. session_start();
  3. if (!isset($_SESSION['admin' ])) {
  4. $_SESSION['TEST'] = 'wan';
  5. }
  6. print $_SESSION['admin'];
  7. print "/n";
  8. print session_id( );
?>
複製程式碼

2,用sessionid到memcached中查詢:
  1. //get_session.php
  2. $mem = new Memcache;
  3. $mem->connect("127.0. 0.1", 11211);
  4. 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"

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn