用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > php教程

PHP 实现多服务器共享 SESSION 数据

时间:2015-01-23  来源:西部数据  作者:西部数据

代码实现,首先创建数据表,MySQL 的 SQL 语句如下:

  1. CREATE TABLE `sess` ( 
  2.  
  3. `sesskey` varchar(32) NOT NULL default ”, 
  4.  
  5. `expiry` bigint(20) NOT NULL default ‘0′, 
  6.  
  7. `data` longtext NOT NULL
  8.  
  9. PRIMARY KEY (`sesskey`), 
  10.  
  11. KEY `expiry` (`expiry`) 
  12.  
  13. ) TYPE=MyISAM 

sesskey 为 SESSION ID,expiry 为 SESSION 过期时间,data 用于保存 SESSION 数据,默认情况下 SESSION 数据是以文件方式保存,想要使用数据库方式保存,就必须重新定义 SESSION 各个操作的处理函数,PHP 提供了session_set_save_handle() 函数,可以用此函数自定义 SESSION 的处理过程,当然首先要先将 session.save_handler 改成 user,可在 PHP 中进行设置,代码如下:

<?php session_module_name(‘user‘); ?>

接下来着重讲一下 session_set_save_handle() 函数,此函数有六个参数:

session_set_save_handler(string open,string close,string read,string write,string destroy,string gc)

各个参数为各项操作的函数名,这些操作依次是:打开、关闭、读取、写入、销毁、垃圾回收,PHP 手册中有详细的例子,在这里我们使用 OO 的方式来实现这些操作,详细代码如下:

  1. <?php 
  2. define(‘MY_SESS_TIME‘, 3600); //SESSION 生存时长 
  3. //类定义 
  4. class My_Sess 
  5. function init() 
  6. $domain = ‘.infor96.com‘; 
  7. //不使用 GET/POST 变量方式 
  8. ini_set(‘session.use_trans_sid‘, 0); 
  9. //设置垃圾回收最大生存时间 
  10. ini_set(‘session.gc_maxlifetime‘, MY_SESS_TIME); 
  11.  
  12. //使用 COOKIE 保存 SESSION ID 的方式 
  13. ini_set(‘session.use_cookies‘, 1); 
  14. ini_set(‘session.cookie_path‘, ‘/‘); 
  15. //多主机共享保存 SESSION ID 的 COOKIE 
  16. ini_set(‘session.cookie_domain‘, $domain); 
  17.  
  18. //将 session.save_handler 设置为 user,而不是默认的 files 
  19. session_module_name(‘user‘); 
  20. //定义 SESSION 各项操作所对应的方法名: 
  21. session_set_save_handler( 
  22. array(‘My_Sess‘, ‘open‘), //对应于静态方法 My_Sess::open(),下同。 
  23. array(‘My_Sess‘, ‘close‘), 
  24. array(‘My_Sess‘, ‘read‘), 
  25. array(‘My_Sess‘, ‘write‘), 
  26. array(‘My_Sess‘, ‘destroy‘), 
  27. array(‘My_Sess‘, ‘gc‘) 
  28. ); 
  29. //end function 
  30. function open($save_path$session_name) { 
  31. return true; 
  32. //end function 
  33. function close() { 
  34. global $MY_SESS_CONN
  35.  
  36. if ($MY_SESS_CONN) { //关闭数据库连接 
  37. $MY_SESS_CONN->Close(); 
  38. return true; 
  39. //end function 
  40. function read($sesskey) { 
  41. global $MY_SESS_CONN
  42.  
  43. $sql = ‘SELECT data FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey) . ‘ AND expiry>=‘ . time(); 
  44. $rs =& $MY_SESS_CONN->Execute($sql); 
  45. if ($rs) { 
  46. if ($rs->EOF) { 
  47. return ”; 
  48. else { //读取到对应于 SESSION ID 的 SESSION 数据 
  49. $v = $rs->fields[0]; 
  50. $rs->Close(); 
  51. return $v
  52. //end if 
  53. //end if 
  54. return ”; 
  55. //end function 
  56. function write($sesskey$data) { 
  57. global $MY_SESS_CONN
  58.  
  59. $qkey = $MY_SESS_CONN->qstr($sesskey); 
  60. $expiry = time() + My_SESS_TIME; //设置过期时间 
  61. //写入 SESSION 
  62. $arr = array
  63. ‘sesskey‘ => $qkey
  64. ‘expiry‘ => $expiry
  65. ‘data‘ => $data); 
  66. $MY_SESS_CONN->Replace(‘sess‘, $arr, ‘sesskey‘, $autoQuote = true); 
  67. return true; 
  68. //end function 
  69. function destroy($sesskey) { 
  70. global $MY_SESS_CONN
  71.  
  72. $sql = ‘DELETE FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey); 
  73. $rs =& $MY_SESS_CONN->Execute($sql); 
  74. return true; 
  75. //end function 
  76. function gc($maxlifetime = null) { 
  77. global $MY_SESS_CONN
  78.  
  79. $sql = ‘DELETE FROM sess WHERE expiry< ‘ . time(); 
  80. $MY_SESS_CONN->Execute($sql); 
  81. //由于经常性的对表 sess 做删除操作,容易产生碎片, 
  82. //所以在垃圾回收中对该表进行优化操作。 
  83. $sql = ‘OPTIMIZE TABLE sess‘; 
  84. $MY_SESS_CONN->Execute($sql); 
  85. return true; 
  86. //end function 
  87. ///:~ 
  88. //使用 ADOdb 作为数据库抽象层。 
  89. require_once(‘adodb/adodb.inc.php‘); 
  90. //数据库配置项,可放入配置文件中(如:config.inc.php)。 
  91. $db_type = ‘mysql‘; 
  92. //开源代码phpfensi.com 
  93. $db_host = ‘192.168.212.1‘; 
  94. $db_user = ‘sess_user‘; 
  95. $db_pass = ‘sess_pass‘; 
  96. $db_name = ‘sess_db‘; 
  97. //创建数据库连接,这是一个全局变量。 
  98. $GLOBALS['MY_SESS_CONN'] =& ADONewConnection($db_type); 
  99. $GLOBALS['MY_SESS_CONN']->Connect( $db_host$db_user$db_pass$db_name); 
  100. //初始化 SESSION 设置,必须在 session_start() 之前运行!! 
  101. My_Sess::init(); 
  102. ?> 
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门