• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

php实现session入库

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

为什么要把session存入数据库?有什么用?

可以:统计在线人数,现实多站点session共享(通行证),控制同个账号登入人数等。

要实现session的入库,有关键的几个基本知识:

session.gc_divisor = 100  session.gc_probability = 1 。session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。( session.gc_probability/session.gc_divisor = 概率)

session.gc_maxlifetime = 1024 。session.gc_maxlifetime 指定过了多少秒之后数据就会被视为“垃圾”并被清除。

session.save_handler = files 。session.save_handler 定义了来存储和获取与会话关联的数据的处理器的名字。默认为 files。参见 session_set_save_handler()

首先设计数据库表:

 [sql] 

  CREATE TABLE IF NOT EXISTS `session` (  

  `phpsession` char(32) COLLATE utf8_bin NOT NULL,  

  `uptime` int(10) unsigned NOT NULL,  

  `data` text COLLATE utf8_bin NOT NULL,  PRIMARY KEY (`phpsession`)  

   ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

 

需要2个class, 一个是数据库的,一个是session的操作类

 

[php] view plain copy
 
 print?
  1. <?php  
  2. /** 
  3.  * session入库操作类 
  4.  * @author 删代码工程师  geek-cy.com 
  5.  */  
  6. include 'DbSession.php'; //引入session数据库操作类  
  7. class MySession extends DbSession{  
  8.     private $dbc = null; //保存数据库资源句柄  
  9.     private $lifetime = null; // session的生成时间  
  10.     private $time = null; //当前时间  
  11.   
  12.     const uptime = 30; //更新session的时间  
  13.   
  14.     static $DEBUG = false; //是否开启错误提示  
  15.   
  16.     public function __construct(  ){  
  17.         $this->init();     
  18.         $this->SessionSetSaveHandler();  
  19.     }  
  20.   
  21.     /** 
  22.      * 初始化session处理 
  23.      * @throws Exception 
  24.      */  
  25.     private function init(){  
  26.         try{  
  27.             //设置数据库链接资源句柄  
  28.             $db = DbSession::InitDbSession(); //获取用于数据库操作的对象  
  29.             if( !($db instanceof DbSession) ){  
  30.                 throw new Exception('需要MySession类的对象');  
  31.             }else{  
  32.                 $this->dbc = $db;  
  33.             }  
  34.             //设置session有效时间  
  35.             if( !$this->lifetime = ini_get('session.gc_maxlifetime') ){  
  36.                 throw new Exception('session.gc_maxlifetime获取失败');  
  37.             }         
  38.         }catch (Exception $e){  
  39.             $this->ShowErrow( $e->getMessage() );  
  40.         }  
  41.         $this->time = time();  
  42. //      ini_set('session.save_handler', user);  
  43.   
  44.     }  
  45.   
  46.     /** 
  47.      * 设置自定义session的回调方法 
  48.      */  
  49.     private function SessionSetSaveHandler(){  
  50.         session_set_save_handler(  
  51.             array($this, "open"),  
  52.             array($this, "close"),  
  53.             array($this, "read"),  
  54.             array($this, "write"),  
  55.             array($this, "destroy"),  
  56.             array($this, "gc")  
  57.         );  
  58.         session_start();//开启session  
  59.     }  
  60.   
  61.     /** 
  62.      * 打开session 
  63.      * @param string $savePath 
  64.      * @param string $sessName 
  65.      * @return boolean 
  66.      */  
  67.     public function open($savePath, $sessName){  
  68.         if(is_null( $this->dbc )){ //判断数据库连接是否正常  
  69.             return false;  
  70.         }else{  
  71.             return true;  
  72.         }  
  73.     }  
  74.   
  75.     /** 
  76.      * 关闭session 
  77.      */  
  78.     public function close(){  
  79.         $this->gc($this->lifetime); //触发垃圾回收机制  
  80.         return $this->dbc->MysqlClose(); //关闭数据库连接  
  81.     }  
  82.   
  83.     /** 
  84.      * 读取session 
  85.      * @param string $sessionid 
  86.      * @return boolean|unknown 
  87.      */  
  88.     public  function read( $sessionid ){  
  89.         $selectData = array(0=>$this->phpsession,1=>$this->uptime,2=>$this->data); // 需要读取的字段,数组形式  
  90.   
  91.         $sessionData = $this->dbc->ReadSession($sessionid, $selectData);  
  92.         //是否返回有效值  
  93.         if( $sessionData == false){  
  94.             return false;  
  95.         }  
  96.   
  97.         //是否过期判断  
  98.         if( $sessionData[$this->uptime] + $this->lifetime < $this->time ){  
  99.             $this->destroy( $sessionData[$this->phpsession] );  
  100.             return false;  
  101.         }  
  102.   
  103.         return $sessionData[$this->data];      
  104.     }  
  105.   
  106.     /** 
  107.      * 写入session 
  108.      * @param string $sessionid 
  109.      * @param string $data 
  110.      * @return boolean 
  111.      */  
  112.     public function write( $sessionid, $data ){  
  113.         $selectData = array(0=>$this->phpsession,1=>$this->uptime,2=>$this->data);// 需要读取的字段,数组形式  
  114.         $sessionData = $this->dbc->ReadSession($sessionid, $selectData);  
  115.         if( $sessionData == false){ //没有session数据  
  116.             if( !empty( $data ) ){ //判断是否用需要插入的session值  
  117.                 //数组形式组装要插入的字段和对应值  
  118.                 $insertData = array(  
  119.                         $this->phpsession    => $sessionid,  
  120.                         $this->uptime        => $this->time,  
  121.                         $this->data          => $data  
  122.                 );  
  123.                 $this->dbc->InsertSession( $insertData );  
  124.             }  
  125.         }else{//已经有了session数据  
  126.             //判断session数据是否有改变,或者需要更新有效时间。   
  127.             if($sessionData[$this->data] != $data || $this->time > ($sessionData[$this->uptime]+self::uptime)){  
  128.                 //以数组形式组装要更新的数据  
  129.                 $updateData = array(  
  130.                         $this->uptime    => $this->time,  
  131.                         $this->data      => $data  
  132.                 );  
  133.                 $this->dbc->UpdateSession($sessionData[$this->phpsession], $updateData );  
  134.             }  
  135.         }  
  136.         return true;  
  137.     }  
  138.   
  139.     /** 
  140.      * 销毁session 
  141.      * @param string $sessionid 
  142.      */  
  143.     public  function destroy( $sessionid ){  
  144.   
  145.         return $this->dbc->DeleteSession( $sessionid );  
  146.     }  
  147.   
  148.     /** 
  149.      * session的回收机制 
  150.      * @param string $lifetime 
  151.      */  
  152.     public function gc( $lifetime ){  
  153.         $this->dbc->GcSession( $lifetime );  
  154.     }  
  155.   
  156. }  
  157.   
  158. ?>  

 

[php] view plain copy
 
 print?
  1. <?php  
  2. /** 
  3.  * session入库的数据库操作类 
  4.  * @author 删代码工程师  geek-cy.com 
  5.  * 
  6.  */  
  7.   
  8. class DbSession{  
  9.     public static $db = null;  
  10.   
  11.     private $con = null; //保存数据库链接资源句柄  
  12.     private $HOSTNAME = 'localhost';   
  13.     private $DB = 'phptest';  
  14.     private $USER = 'root';  
  15.     private $PASSWORD = '';  
  16.     const CHARSET = 'UTF8'; //编码设置  
  17.   
  18.     static $DEBUG = true; //是否开启错误提示  
  19.   
  20.     //session表与表字段  
  21.     private $TableName = 'session';   
  22.     protected $phpsession = 'phpsession';   
  23.     protected $uptime = 'uptime';  
  24.     protected $data = 'data';   
  25.   
  26.     private function __construct(){  
  27.         $this->contect();  
  28.     }  
  29.   
  30.     private function __clone(){  
  31.   
  32.     }  
  33.   
  34.     /** 
  35.      * 初始化链接数据库 
  36.      * @return Ambigous <NULL, string> 
  37.      */  
  38.     public static function InitDbSession(){  
  39.         if( is_null(self::$db) || !(self::$db instanceof self) ){  
  40.             self::$db = new DbSession;  
  41.   
  42.         }  
  43.         return self::$db; //返回类对象  
  44.     }  
  45.   
  46.     /** 
  47.      * 链接数据库 
  48.      *  
  49.      */  
  50.     private  function contect(){  
  51.         $this->con = mysql_connect($this->HOSTNAME, $this->USER, $this->PASSWORD); //保存数据库连接资源句柄  
  52.         try{  
  53.             if( is_null($this->con) ){  
  54.                 throw new Exception('链接数据库失败');  
  55.             }  
  56.             if(!mysql_select_db($this->DB, $this->con)){  
  57.                 throw new Exception('选择数据库失败');  
  58.             }  
  59.             mysql_query("SET NAMES self::CHARSET");  
  60.   
  61.         }catch (Exception $e){  
  62.             $this->ShowErrow( $e->getMessage() );  
  63.         }  
  64.     }  
  65.     /** 
  66.      * 输出错误 
  67.      * @param string $msg 
  68.      */  
  69.     protected function ShowErrow( $msg ){  
  70.         if(static::$DEBUG){ //判断是否打印错误  
  71.             echo $msg;  
  72.         }  
  73.     }  
  74.   
  75.     /** 
  76.      * 读取数据库中保存的session 
  77.      * @param string $sessionid 
  78.      * @param array $selectData 
  79.      * @return boolean|Ambigous <boolean, multitype:> 
  80.      */  
  81.     public function ReadSession( $sessionid, array $selectData ){  
  82.         $selectData = $this->doSelectData($selectData);  
  83.         if(!$selectData){  
  84.             return false;  
  85.         }  
  86.         if( $this->CheckSessionId($sessionid) ){  
  87.             $sql = 'SELECT '.$selectData.' FROM `'.$this->TableName.'` WHERE '.$this->phpsession.' = \''.$sessionid.'\' LIMIT 1';  
  88.             $result = mysql_query($sql, $this->con);  
  89.             return $this->fetch($result);  
  90.         }     
  91.     }  
  92.   
  93.     /** 
  94.      * 写入新session到数据库中 
  95.      * @param array $insertData 
  96.      * @return boolean 
  97.      */  
  98.     public function InsertSession( array $insertData ){  
  99.         if( $insertData = $this->doInsertData($insertData) ){  
  100.             $sql = 'INSERT INTO '.$this->TableName.'('.$insertData[0].') VALUES('.$insertData[1].')';  
  101.             mysql_query($sql, $this->con);  
  102.             return true;  
  103.         }else{  
  104.             return false;  
  105.         }         
  106.     }  
  107.   
  108.     /** 
  109.      * 更新数据库中保存的session 
  110.      * @param string $sessionid 
  111.      * @param array $updateData 
  112.      * @return boolean 
  113.      */  
  114.     public function UpdateSession( $sessionid, array $updateData){  
  115.         if( !$this->CheckSessionId($sessionid) ){  
  116.             return false;  
  117.         }  
  118.   
  119.         if( $updateData = $this->doUpadateData($updateData) ){  
  120.             $sql = 'UPDATE '.$this->TableName.' SET '.$updateData.' WHERE '.$this->phpsession.' = \''.$sessionid.'\'';  
  121.             mysql_query($sql, $this->con);  
  122.             return true;  
  123.         }else{  
  124.             return false;  
  125.         }  
  126.     }  
  127.     /** 
  128.      * 删除数据库中的session 
  129.      * @param string $sessionid 
  130.      * @return boolean 
  131.      */  
  132.     public function DeleteSession( $sessionid ){  
  133.         if( !$this->CheckSessionId($sessionid) ){  
  134.             return false;  
  135.         }  
  136.         $sql = 'DELETE FROM '.$this->TableName.' WHERE \''.$sessionid.'\' = '.$this->phpsession;  
  137.         mysql_query($sql,$this->con);  
  138.         return true;  
  139.     }  
  140.   
  141.     /** 
  142.      * 回收清除数据库中已经获取无用的session 
  143.      * @param string $lifetime 
  144.      * @return boolean 
  145.      */  
  146.     public function GcSession( $lifetime ){  
  147.         if( !ctype_digit($lifetime )){  
  148.             return false;  
  149.         }  
  150.         $checktime = time()-$lifetime;  
  151.         $sql = 'DELETE FROM '.$this->TableName.' WHERE '.$this->uptime.' < '.$checktime ;  
  152.         mysql_query($sql,$this->con);  
  153.         return true;  
  154.     }  
  155.   
  156.     /** 
  157.      * 关闭数据库连接 
  158.      */  
  159.     public function MysqlClose(){  
  160.         mysql_close( $this->con );  
  161.     }  
  162.   
  163.     public function __destruct(){  
  164.         self::$db = null;  
  165.         if($this->con instanceof self){  
  166.             mysql_close( $this->con );  
  167.         }  
  168.     }  
  169.   
  170.     /** 
  171.      * 对session id 做合法性检查 
  172.      * @param string $sessionid 
  173.      * @return boolean 
  174.      */  
  175.     private function CheckSessionId( $sessionid ){  
  176.         return ctype_alnum($sessionid);  
  177.     }  
  178.   
  179.     /** 
  180.      * 返回select取得的结果集 
  181.      * @param  $result 
  182.      * @return boolean|multitype: 
  183.      */  
  184.     private function fetch(  $result ){  
  185.         if( $result && mysql_num_rows($result) == 1){  
  186.             $resultArray = array();  
  187.             $resultArray = mysql_fetch_array($result, MYSQL_ASSOC);  
  188.             if( !$resultArray || count($resultArray)== 0 ){  
  189.                 return false;  
  190.             }else{  
  191.                 return $resultArray;  
  192.             }  
  193.   
  194.         }else{  
  195.             return false;  
  196.         }  
  197.     }  
  198.   
  199.     /** 
  200.      * 处理select要查询的字段 
  201.      * @param array $data 
  202.      * @return boolean|string 
  203.      */  
  204.     private function doSelectData( array $data ){  
  205.         $keyString = '';  
  206.         foreach ($data as $value){  
  207.             $keyString .= '`'.$value.'`,';  
  208.         }  
  209.         $keyString   =  substr($keyString,0,-1);  
  210.         if($keyString == ''){  
  211.             return false;  
  212.         }  
  213.         return $keyString;  
  214.   
  215.     }  
  216.   
  217.     /** 
  218.      * 处理要insert进数据库的字段和对应的值 
  219.      * @param array $data 
  220.      * @return boolean|string 
  221.      */  
  222.     private function doInsertData( array $data ){  
  223.         $keyString = '';  
  224.         $valueString = '';  
  225.         if(array_key_exists($this->phpsession, $data)){  
  226.             if( !$this->CheckSessionId($data[$this->phpsession]) ){  
  227.                 return false;  
  228.             }  
  229.         }  
  230.   
  231.         foreach ($data as $key => $value){  
  232.             $keyString .= '`'.$key.'`,';  
  233.             if(ctype_digit($value)){  
  234.                 $valueString .= ''.$value.',';  
  235.             }else{  
  236.                 $valueString .= '\''.$value.'\',';  
  237.             }  
  238.   
  239.         }  
  240.         if( $keyString != '' && $valueString != ''){  
  241.             $keyString   =  substr($keyString,0,-1);  
  242.             $valueString =  substr($valueString,0,-1);  
  243.             $dataArray[0] = $keyString; //字段  
  244.             $dataArray[1] = $valueString;//值  
  245.             return $dataArray;  
  246.         }else{  
  247.             return false;  
  248.         }  
  249.   
  250.     }  
  251.   
  252.     /** 
  253.      * 处理update的字段和对应的值 
  254.      * @param array $data 
  255.      * @return boolean|string 
  256.      */  
  257.     private function doUpadateData( array $data ){  
  258.         $upDataString = '';  
  259.   
  260.         foreach($data as $key => $value){  
  261.             if(ctype_digit($value)){  
  262.                 $value = ''.$value.'';  
  263.             }else{  
  264.                 $value = '\''.$value.'\'';  
  265.             }  
  266.             $upDataString .= '`'.$key.'` = '.$value.',';  
  267.         }  
  268.         $upDataString = substr($upDataString,0,-1);  
  269.         if( $upDataString == ''){  
  270.             return false;  
  271.         }  
  272.         return $upDataString;  
  273.     }  
  274.   
  275. }  


下面是使用方法:

 

 

 

[php] view plain copy
 
 print?
    1. <?php   
    2. include 'MySession.php';  
    3.   
    4. $session = new MySession( );  
    5. $_SESSION['test1'] = 'test1';  
    6. $_SESSION['test2'] = 2;  
    7. $_SESSION['test3'] = array(1,2,3,4);  
    8.   
    9. // session_destroy();  
    10. ?>  

 

 
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
php根据ip查询所在地区(非常有用,赶集网就用到)发布时间:2022-07-10
下一篇:
CentOS下php安装mcrypt扩展发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap