speedphp支持把session存入数据库吗?

#1 gymiles

speedphp支持把session存入数据库吗?如何操作?

2010-04-17 21:01:48

#2 azwl

回复 1 gymiles


    存入数据库和sp没有关系吧

你的意思是?

2010-04-17 22:39:51

#3 gymiles

呵呵,我知道ci和fleaphp支持的,在数据库里面建一个session表,修改一下配置,就可以用数据库而不是用文件来操作应用session了,不知道speedphp有这方面的功能吗?
speedphp刚接触了一下,感觉不错,简洁好用

2010-04-18 09:37:20

#4 jake

呵呵,SESSION保存方式是PHP自带的功能,所以speedphp不会说成自己支持或不支持,因为PHP本身支持,对吧。

SESSION可以通过PHP.ini或者函数(session_set_save_handler)的方式可以配置成用数据库保存的形式。

PHP手册里面就有写:http://cn.php.net/manual/en/function.session-set-save-handler.php

尤其是手册下面的评论里面某位高手发的,就是SESSION存入数据库的类。


  class SessionDB {
    private $data=null;
    private $session_id=null;
    private $minutes_to_expire=3600; // TIME TO MAINTAIN DATA ON DB
   
    public function __construct(){
      global $SESSION;
      
      if (isset($_COOKIE['session_id'])){
        $this->session_id = $_COOKIE['session_id'];
      } else {
        
        $this->session_id = md5(microtime().rand(1,9999999999999999999999999)); // GENERATE A RANDOM ID
        
        setcookie('session_id',$this->session_id);
        
        $sql = "INSERT INTO `tb_session_db` (`session_id`, `updated_on`) VALUES ('{$this->session_id}', NOW())";
        mysql_query($sql);
      }
      
      $sql = "SELECT `value` FROM `tb_session_db` WHERE `session_id`='{$this->session_id}'";
      $query = mysql_query($sql);
      
      $this->data = unserialize(mysql_result($query, 0, 'value'));
      $SESSION = $this->data;
    }
   
    private function expire(){
      $date_to_delete = date("Y-m-d H:i:s", time()-60*$this->minutes_to_expire);
      $sql = "DELETE FROM `tb_session_db` WHERE `update_on` <= '$date_to_delete'";
      mysql_query($sql);
    }
   
    public function __destruct(){
      global $SESSION;
      
      $this->data = serialize($SESSION);
      
      $sql = "UPDATE `tb_session_db` SET `value`='{$this->data}', `updated_on`=NOW() WHERE `session_id`='{$this->session_id}'";
      mysql_query($sql);
      
      $this->expire();
    }
  }
  
/*
TABLE STRUCTURE
  CREATE TABLE IF NOT EXISTS `tb_session_db` (
    `session_id` varchar(32) NOT NULL,
    `value` blob,
    `updated_on` datetime DEFAULT NULL,
    PRIMARY KEY (`session_id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
*/
?>

With this file included, connected to MySQL database who has the table `tb_session_db` I can easy do that into my config file:

  require_once('session_db.php');
  
    define('MYSQL_HOST','mysql.example.com');
    define('MYSQL_USER','.......');
    define('MYSQL_PASS','.......');
    define('MYSQL_BASE','.......');
   
    mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) or die('Cannot connect');
    mysql_select_db(MYSQL_BASE) or die('Cannot select DB');
    mysql_set_charset('utf8_general_ci');
   
  $SESSION = null;
  global $SESSION;
  $session_db = new SessionDB();
?>

2010-04-18 17:21:15