VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > PHP >
  • PHP 实现多服务器共享 SESSION 数据

代码实现,首先创建数据表,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. { 
  6. function init() 
  7. { 
  8. $domain = ‘.infor96.com‘; 
  9. //不使用 GET/POST 变量方式 
  10. ini_set(‘session.use_trans_sid‘, 0); 
  11. //设置垃圾回收最大生存时间 
  12. ini_set(‘session.gc_maxlifetime‘, MY_SESS_TIME); 
  13.  
  14. //使用 COOKIE 保存 SESSION ID 的方式 
  15. ini_set(‘session.use_cookies‘, 1); 
  16. ini_set(‘session.cookie_path‘, ‘/‘); 
  17. //多主机共享保存 SESSION ID 的 COOKIE 
  18. ini_set(‘session.cookie_domain‘, $domain); 
  19.  
  20. //将 session.save_handler 设置为 user,而不是默认的 files 
  21. session_module_name(‘user‘); 
  22. //定义 SESSION 各项操作所对应的方法名: 
  23. session_set_save_handler( 
  24. array(‘My_Sess‘, ‘open‘), //对应于静态方法 My_Sess::open(),下同。 
  25. array(‘My_Sess‘, ‘close‘), 
  26. array(‘My_Sess‘, ‘read‘), 
  27. array(‘My_Sess‘, ‘write‘), 
  28. array(‘My_Sess‘, ‘destroy‘), 
  29. array(‘My_Sess‘, ‘gc‘) 
  30. ); 
  31. } //end function 
  32. function open($save_path, $session_name) { 
  33. return true; 
  34. } //end function 
  35. function close() { 
  36. global $MY_SESS_CONN; 
  37.  
  38. if ($MY_SESS_CONN) { //关闭数据库连接 
  39. $MY_SESS_CONN->Close(); 
  40. } 
  41. return true; 
  42. } //end function 
  43. function read($sesskey) { 
  44. global $MY_SESS_CONN; 
  45.  
  46. $sql = ‘SELECT data FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey) . ‘ AND expiry>=‘ . time(); 
  47. $rs =& $MY_SESS_CONN->Execute($sql); 
  48. if ($rs) { 
  49. if ($rs->EOF) { 
  50. return ”; 
  51. } else { //读取到对应于 SESSION ID 的 SESSION 数据 
  52. $v = $rs->fields[0]; 
  53. $rs->Close(); 
  54. return $v; 
  55. } //end if 
  56. } //end if 
  57. return ”; 
  58. } //end function 
  59. function write($sesskey, $data) { 
  60. global $MY_SESS_CONN; 
  61.  
  62. $qkey = $MY_SESS_CONN->qstr($sesskey); 
  63. $expiry = time() + My_SESS_TIME; //设置过期时间 
  64. //写入 SESSION 
  65. $arr = array( 
  66. ‘sesskey‘ => $qkey, 
  67. ‘expiry‘ => $expiry, 
  68. ‘data‘ => $data); 
  69. $MY_SESS_CONN->Replace(‘sess‘, $arr, ‘sesskey‘, $autoQuote = true); 
  70. return true; 
  71. } //end function 
  72. function destroy($sesskey) { 
  73. global $MY_SESS_CONN; 
  74.  
  75. $sql = ‘DELETE FROM sess WHERE sesskey=‘ . $MY_SESS_CONN->qstr($sesskey); 
  76. $rs =& $MY_SESS_CONN->Execute($sql); 
  77. return true; 
  78. } //end function 
  79. function gc($maxlifetime = null) { 
  80. global $MY_SESS_CONN; 
  81.  
  82. $sql = ‘DELETE FROM sess WHERE expiry< ‘ . time(); 
  83. $MY_SESS_CONN->Execute($sql); 
  84. //由于经常性的对表 sess 做删除操作,容易产生碎片, 
  85. //所以在垃圾回收中对该表进行优化操作。 
  86. $sql = ‘OPTIMIZE TABLE sess‘; 
  87. $MY_SESS_CONN->Execute($sql); 
  88. return true; 
  89. } //end function 
  90. } ///:~ 
  91. //使用 ADOdb 作为数据库抽象层。 
  92. require_once(‘adodb/adodb.inc.php‘); 
  93. //数据库配置项,可放入配置文件中(如:config.inc.php)。 
  94. $db_type = ‘mysql‘; 
  95. //开源代码phpfensi.com 
  96. $db_host = ‘192.168.212.1‘; 
  97. $db_user = ‘sess_user‘; 
  98. $db_pass = ‘sess_pass‘; 
  99. $db_name = ‘sess_db‘; 
  100. //创建数据库连接,这是一个全局变量。 
  101. $GLOBALS['MY_SESS_CONN'] =& ADONewConnection($db_type); 
  102. $GLOBALS['MY_SESS_CONN']->Connect( $db_host, $db_user, $db_pass, $db_name); 
  103. //初始化 SESSION 设置,必须在 session_start() 之前运行!! 
  104. My_Sess::init(); 
  105. ?> 
  106.  

出处:http://www.phpfensi.com/php/20140828/4941.html


相关教程