当前位置:Gxlcms > PHP教程 > PHP兑现多服务器session共享之memcache共享

PHP兑现多服务器session共享之memcache共享

时间:2021-07-01 10:21:17 帮助过:4人阅读

PHP实现多服务器session共享之memcache共享

使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少

首先打开php.ini文件,找到session的部分:(分号后面的是注释)

[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

  1. ini_set("session.save_handler", "memcache");
  2. ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211");

用memcached 来作PHP 的session.save_handler

  1. ini_set("session.save_handler","memcached");
  2. ini_set("session.save_path","127.0.0.1:11211");

PHP实现多服务器session共享之memcache共享

再自定义一套session处理机制,关于session的实现方法我就不再多讲,直接贴程序了。

  1. <!--?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
  3. //===========================================
  4. // 程序: Memcache-Based Session Class
  5. // 功能: 基于Memcache存储的 Session 功能类
  6. // 作者: yejr
  7. // 网站: http://imysql.cn
  8. // 时间: 2007-01-05
  9. //===========================================
  10. /**
  11. * 文件: MemcacheSession.inc.php
  12. * 类名: MemcacheSession Class
  13. * 功能: 自主实现基于Memcache存储的 Session 功能
  14. * 描述: 这个类就是实现Session的功能,基本上是通过
  15. * 设置客户端的Cookie来保存SessionID,
  16. * 然后把用户的数据保存在服务器端,最后通过
  17. * Cookie中的Session Id来确定一个数据是否是用户的,
  18. * 然后进行相应的数据操作
  19. *
  20. * 本方式适合Memcache内存方式存储Session数据的方式,
  21. * 同时如果构建分布式的Memcache服务器,
  22. * 能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
  23. *
  24. * 注意: 本类必须要求PHP安装了Memcache扩展或者必须有Memcache的PHP API
  25. * 获取Memcache扩展请访问: http://pecl.php.com
  26. */
  27. //设定 SESSION 有效时间,单位是 秒
  28. define('SESS_LIFTTIME', 3600);
  29. //定义memcache配置信息
  30. define('MEMCACHE_HOST', 'localhost');
  31. define('MEMCACHE_PORT', '10000');
  32. if (!defined('MemcacheSession'))
  33. {
  34. define('MemcacheSession', TRUE);
  35. class MemacheSession
  36. {
  37. // {{{ 类成员属性定义
  38. static $mSessSavePath;
  39. static $mSessName;
  40. static $mMemcacheObj;
  41. // }}}
  42. // {{{ 初始化构造函数
  43. /**
  44. * 构造函数
  45. *
  46. * @param string $login_user 登录用户
  47. * @param int $login_type 用户类型
  48. * @param string $login_sess 登录Session值
  49. * @return Esession
  50. */
  51. 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:Can not load Memcache extension!');
  58. }
  59. if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
  60. {
  61. return false;
  62. }
  63. self::$mMemcacheObj = new Memcache;
  64. if (!self::$mMemcacheObj--->connect(MEMCACHE_HOST , MEMCACHE_PORT))
  65. {
  66. die('Fatal Error: Can not connect to memcache host '. MEMCACHE_HOST .':'. MEMCACHE_PORT);
  67. }
  68. return TRUE;
  69. }
  70. // }}}
  71. /** {{{ sessOpen($pSavePath, $name)
  72. *
  73. * @param String $pSavePath
  74. * @param String $pSessName
  75. *
  76. * @return Bool TRUE/FALSE
  77. */
  78. public function sessOpen($pSavePath = '', $pSessName = '')
  79. {
  80. self::$mSessSavePath = $pSavePath;
  81. self::$mSessName = $pSessName;
  82. return TRUE;
  83. }
  84. // }}}
  85. /** {{{ sessClose()
  86. *
  87. * @param NULL
  88. *
  89. * @return Bool TRUE/FALSE
  90. */
  91. public function sessClose()
  92. {
  93. return TRUE;
  94. }
  95. // }}}
  96. /** {{{ sessRead($wSessId)
  97. *
  98. * @param String $wSessId
  99. *
  100. * @return Bool TRUE/FALSE
  101. */
  102. public function sessRead($wSessId = '')
  103. {
  104. $wData = self::$mMemcacheObj->get($wSessId);
  105. //先读数据,如果没有,就初始化一个
  106. if (!empty($wData))
  107. {
  108. return $wData;
  109. }
  110. else
  111. {
  112. //初始化一条空记录
  113. $ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
  114. if (TRUE != $ret)
  115. {
  116. die("Fatal Error: Session ID $wSessId init failed!");
  117. return FALSE;
  118. }
  119. return TRUE;
  120. }
  121. }
  122. // }}}
  123. /** {{{ sessWrite($wSessId, $wData)
  124. *
  125. * @param String $wSessId
  126. * @param String $wData
  127. *
  128. * @return Bool TRUE/FALSE
  129. */
  130. public function sessWrite($wSessId = '', $wData = '')
  131. {
  132. $ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME);
  133. if (TRUE != $ret)
  134. {
  135. die("Fatal Error: SessionID $wSessId Save data failed!");
  136. return FALSE;
  137. }
  138. return TRUE;
  139. }
  140. // }}}
  141. /** {{{ sessDestroy($wSessId)
  142. *
  143. * @param String $wSessId
  144. *
  145. * @return Bool TRUE/FALSE
  146. */
  147. public function sessDestroy($wSessId = '')
  148. {
  149. self::sessWrite($wSessId);
  150. return FALSE;
  151. }
  152. // }}}
  153. /** {{{ sessGc()
  154. *
  155. * @param NULL
  156. *
  157. * @return Bool TRUE/FALSE
  158. */
  159. public function sessGc()
  160. {
  161. //无需额外回收,memcache有自己的过期回收机制
  162. return TRUE;
  163. }
  164. // }}}
  165. /** {{{ initSess()
  166. *
  167. * @param NULL
  168. *
  169. * @return Bool TRUE/FALSE
  170. */
  171. public function initSess()
  172. {
  173. //不使用 GET/POST 变量方式
  174. ini_set('session.use_trans_sid', 0);
  175. //设置垃圾回收最大生存时间
  176. ini_set('session.gc_maxlifetime', SESS_LIFTTIME);
  177. //使用 COOKIE 保存 SESSION ID 的方式
  178. ini_set('session.use_cookies', 1);
  179. ini_set('session.cookie_path', '/');
  180. $domain = '.imysql.cn';
  181. //多主机共享保存 SESSION ID 的 COOKIE
  182. ini_set('session.cookie_domain', $domain);
  183. //将 session.save_handler 设置为 user,而不是默认的 files
  184. session_module_name('user');
  185. //定义 SESSION 各项操作所对应的方法名:
  186. session_set_save_handler(
  187. array('MemacheSession', 'sessOpen'), //对应于静态方法 My_Sess::open(),下同。
  188. array('MemacheSession', 'sessClose'),
  189. array('MemacheSession', 'sessRead'),
  190. array('MemacheSession', 'sessWrite'),
  191. array('MemacheSession', 'sessDestroy'),
  192. array('MemacheSession', 'sessGc')
  193. );
  194. session_start();
  195. return TRUE;
  196. }
  197. // }}}
  198. }//end class
  199. }//end define
  200. $memSess = new MemacheSession;
  201. $memSess->initSess();
  202. ?>

?然后,在项目程序的头文件中直接包含 MemacheSession.inc.php 即可,并且以前的程序不用做任何改动。
测试 创建一个session

  1. <!--?php
  2. //set_session.php
  3. session_start();
  4. if (!isset($_SESSION['admin'])) {
  5. $_SESSION['TEST'] = 'wan';
  6. }
  7. print $_SESSION['admin'];
  8. print "/n";
  9. print session_id();
  10. ?-->

用 sessionid 去 memcached 里查询一下

  1. <!--?php
  2. //get_session.php
  3. $mem = new Memcache;
  4. $mem--->connect("127.0.0.1", 11211);
  5. var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
  6. ?>
?

备注:memcache PECL 未来版本中,可以直接设置 php.ini 来这定自己的 session.save_handler,大致如下:

  1. session.save_handler = memcache
  2. session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"

1 楼 any_luf 2012-02-08

人气教程排行