走过平凡人生、留下平凡足迹 注册 | 登陆

自定义SESSION(二)——数据库保存

这里打算使用数据库来保存session,应该说用数据库来保存是更加有效而且更方便共享的一种方法。

  首先,说明下session_set_save_handler()里面的每个函数。
记住一点:session数据都是在你的代码运行完后才写入代码的

 

 

php代码
  1. <?function open($save_path$session_name)     
  2. {    
  3.   //打开session文件,用来设计保存路径,一般直接return true 就好了    
  4.   //在session_start()中会调用到。    
  5. }    
  6.   
  7. function close()     
  8. {    
  9.    //关闭session连接    
  10. }    
  11.   
  12. function read($id)     
  13. {    
  14.   //读取session数据,在session_start()中调用。    
  15. }    
  16.   
  17. function write($id$sess_data)     
  18. {    
  19.   //写session到文件或者数据库    
  20.   //记住$_SESSION['var']='test'这种对session赋值并不调用该方法。该方法是在代码结束后或者调用session_write_close()调用的时候才运行的。    
  21. }    
  22.   
  23. function destroy($id)     
  24. {    
  25.     //注销session,删除一条session记录    
  26. }    
  27.   
  28. function gc($maxlifetime)     
  29. {    
  30.     //删除过时的session记录    
  31.  }    
  32. ?>    

然后,使用mysql来保存。详细了解了每个函数的作用,这样用数据库来保存就很简单了。这里我给一个例子。
  mysql_session.php

 

PHP代码
  1. <?    
  2. /**   
  3.  *CREATE TABLE `session` (   
  4.   `sid` char(32) NOT NULL,   
  5.   `expiry` int(10) NOT NULL,   
  6.   `value` mediumtext NOT NULL,   
  7.   PRIMARY KEY  (`sid`)   
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;   
  9.  *   
  10.  */    
  11.   
  12. function init_db(){    
  13.     $db["host"]='localhost';//    
  14.     $db["database"]="pcti";    
  15.     $db["user"]="root";    
  16.     $db["password"]="admin";    
  17.     $db=new PDO('mysql:host='.$db['host'].';dbname='.$db['database'],$db['user'],$db['password']);    
  18.     $db->query("set names 'utf8'");    
  19.     return $db;    
  20. }    
  21.   
  22. class session{    
  23.         
  24.     private $db;    
  25.         
  26.     function __construct($db){    
  27.         $this->db=$db;    
  28.     }    
  29.         
  30.     public function open($save_path,$session_name){    
  31.         return true;    
  32.     }    
  33.         
  34.     public function close(){    
  35.         $this->db=null;    
  36.         return true;    
  37.     }    
  38.         
  39.     public function read($sid){    
  40.         $rs=$this->db->query('select * from session where sid=''.$sid.''');    
  41.         foreach ($rs as $row){    
  42.             return $row['value'];    
  43.         }    
  44.         return null;    
  45.     }    
  46.         
  47.     public function write($sid,$value){    
  48.         if(is_null($old_value=$this->read($sid))){    
  49.             //insert    
  50.             return $this->db->query("insert into session (sid,expiry,value)values('".$sid."','".time()."','".$value."')");    
  51.         }else{    
  52.             //update    
  53.             return $this->db->query("update session set expiry='".time()."',value='".$old_value.$value."' where sid='".$sid."'");    
  54.         }    
  55.     }    
  56.         
  57.     public function destroy($sid){    
  58.         return $this->db->query('delete from session where sid=''.$sid.''');    
  59.     }    
  60.         
  61.     public function gc($max_life_time){    
  62.         return $this->db->query('delete from session where expiry+'.$max_life_time.'<'.time());    
  63.     }    
  64. }    
  65. $session=new session(init_db());    
  66.   
  67. session_set_save_handler(array($session,'open'),    
  68.                          array($session,'close'),    
  69.                          array($session,'read'),    
  70.                          array($session,'write'),    
  71.                          array($session,'destroy'),    
  72.                          array($session,'gc'));    
  73. session_start();    
  74. ?>  

里面有相应的创建数据库的语句。

  然后写一个测试文件看看。
  创建session:mysql_session_test.php


<?
include('mysql_session.php'
);
$_SESSION['test']='mysql session test'
;
?> <a href="mysql_session_check.php">next</a>


    运行下,然后看看数据库中是不是多了条记录?呵呵,如果是,恭喜测试成功。

  查看session:mysql_session_check.php


<?
include('mysql_session.php'
);
print_r($_SESSION
);
?><a href="mysql_session_exit.php">exit</a>



 
  注销session测试:mysql_session_exit.php


<?
include('mysql_session.php'
);
session_destroy
();
header('location:mysql_session_check.php'
);
?>


 
   呵呵,再次测试都没有问题。测试环境winxp+php5.2+apache 2.2 +mysql 5.0

总结
   之前我完全脱离PHP内置的session机制,使用数据库和cookie来模拟。现在发现直接使用自定义session更加简单,方便。但两者之间谁更加可取还有待商榷。

Tags: php, session, 数据库, mysql

« 上一篇 | 下一篇 »

Trackbacks

点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5

发表评论

评论内容 (必填):