session入库(MYSQL)

首先我们先说的是session大多数是以文件的形式存放在文件中,但是当session的数据达到一定的数量的时候,会极大的拖低了服务器的相应的速度,我们就不已文件的形式存储,就得出了两种方案,一种是存放在内存中,另一种的存放在mysql中

现在我们就来说一下session入库的操作

php的session默认的情况下是采用的文件方式来保存的,我们在php的配制文件php.ini中可以看到这样的一行,session.save_handler="files",这样的意思就是采用文件来保存session 的,要采用数据库来保存的话,我们需要修改成拥护模式,改称 session.save_handler="use"就可以了,但是,这仅仅是说明我门没有采用文件的方式存储session。

主要是通过 bool session_set_save_handler(seesion_open,seesion_close,session_read,session_write,session_destory,session_gc);

依次对应的是开启seesion连接方式,关闭session,读取session,写拉seesion,销毁session,seesion的垃圾加收机制。

 告知session机制,在需要读写时,使用用户自定义的读写函数完成

Session_set_save_handler(

开始函数,结束函数,读函数,写函数,删除函数,GC函数

);

创建一个存放session的数据表(如下)

sid用于存放session_id的,字段类型为字符型,长度为32

value用于存放session的内容,字段类型为text

expiration用于存放session的生存期(最主要就是这三个)

下面给大家写了一个session入库的类库:

<?php
class MySessionHandler implements SessionHandlerInterface {
  /**
   * @access private
   * @var object 数据库连接
   */
  private $_dbLink;
  /**
   * @access private
   * @var string 保存session的表名
   */
  Private $_sessionTable;
  /**
   * @access private
   * @var string session名
   */
  private $_sessionName;
  /**
   * @const 过期时间/秒
   */
  const SESSION_EXPIRE = 60;

  public function __construct($dbLink, $sessionTable) {
    if(!is_object($dbLink)) {
      return false;
    }
    $this->_dbLink = $dbLink;
    $this->_sessionTable = $sessionTable;
  }

  /**
   * 打开
   * @access public
   * @param string $session_save_path 保存session的路径
   * @param string $session_name session名
   * @return integer
   */
  public function open($session_save_path, $session_name) {
    $this->_sessionName = $session_name;
    return 0;
  }

  /**
   * 关闭session
   * @access public
   * @return integer
   */
  public function close() {
    return 0;
  }

  /**
   * 读取session
   * @access public
   * @param string $session_id session ID
   * @return string
   */
  public function read($session_id) {
    $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";
    $result = $this->_dbLink->query($query);
    if(!isset($value) || empty($value)) {
      $value = "";
      return $value;
    }
    $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}");
    $value = $result->fetch_array();
    $result->free();
    return $value['value'];
  }

  /**
   * 写入session
   * @access public
   * @param string $session_id session ID      自动获取session ID
   * @param string $session_data session data  自动获取session data
   * @return integer
   */
  public function write($session_id, $session_data) {
    $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())";
    $result = $this->_dbLink->query($query);
    $result = $result->fetch_array();
    if(!empty($result)) {
      $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = '{$session_data}' WHERE sid = '{$session_id}'");
    }
    else{
      $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (`sid`, `value`) VALUES ('{$session_id}', '{$session_data}')");
    }
    if($result){
      return 0;
    }
    else{
      return 1;
    }
  }

  /**
   * 销毁session
   * @access public
   * @param string $session_id session ID
   * @return integer
   */
  public function destroy($session_id) {
    $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'");
    if($result){
      return 0;
    }
    else{
      return 1;
    }
  }

  /**
   * 垃圾回收
   * @access public
   * @param string $maxlifetime session 最长生存时间
   * @return integer
   */
  public function gc($maxlifetime) {
    $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE);
    if($result){
      return 0;
    }
    else{
      return 1;
    }
  }

}

然后我们要将session入库了:

<?php
header('content-type:text/html;charset=utf-8');
//date_default_timezone_set('PRC');

//引入类文件
require_once "MySessionHandler.class.php";
//链接数据库
$dbLink = new mysqli("localhost", "root", "root", "stucourse");
//定义需要操作的session数据表
$sessionTable = "sessioninfo";
//实类化类   
$handler = new MySessionHandler($dbLink, $sessionTable);
//告知session机制,在需要读写时,使用用户自定义的读写函数完成
session_set_save_handler($handler);
//修改PHP.ini中session的垃圾回收触发得到频率(默认1/1000)
ini_set('session.gc_probability',1);    //分子
ini_set('session.gc_divisor',1);        //分母
//开启session
session_start();
$_SESSION['user'] = "liweijia";
echo $_SESSION["user"];

有什么不对的还请各位大神请教!


猜你喜欢

转载自blog.csdn.net/qq_41718455/article/details/80515088