ThinkPHP 5.0添加mysql存session驱动
php中Session默认都是用文件存储的,thinkphp是提供了redis和Memcache的存储类,但是没有提供Mysql的储存类,现在修改为用数据库的方式储存,直接上代码:
<?php
/**
* session 存mysql类
* dcr163.cn
*/
namespace think\session\driver;
use SessionHandler;
use think\Db;
use think\Config;
use think\Exception;
/**
* 数据库方式Session驱动
* 表结构
* CREATE TABLE `tp_session` (
* `session_id` VARCHAR(150) NOT NULL COMMENT 'session_key',
* `session_data` TEXT COMMENT 'session_值',
* `expire_time` int(11) NOT NULL DEFAULT '0' COMMENT '过期时间',
* KEY `idx_session_id` (`session_id`),
* UNIQUE KEY `session_id` (`session_id`),
* KEY `idx_expire_time` (`expire_time`)
* ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='session表';
*
*/
class Mysql extends SessionHandler
{
protected $handler = null;
protected $table_name = null;
protected $config = [
'expire_time' => 3600, // Session有效期 单位:秒
'session_name' => 'tp_', // Session前缀
'table_name' => 'session', // 表名(不包含表前缀)
];
protected $database = [
'type' => 'mysql', // 数据库类型
'hostname' => '127.0.0.1', // 服务器地址
'database' => '', // 数据库名
'username' => 'root', // 用户名
'password' => '', // 密码
'hostport' => '3306', // 端口
'prefix' => 'tp_', // 表前缀
'charset' => 'utf8', // 数据库编码
'debug' => true, // 数据库调试模式
];
public function __construct($config = [])
{
// 获取数据库配置
if(isset($config['database']) && !empty($config['database']))
{
if(is_array($config['database'])){
$database = $config['database'];
}elseif(is_string($config['database'])){
$database = Config::get($config['database']);
}else{
throw new Exception('session error:database');
}
unset($config['database']);
}else{
// 使用默认的数据库配置
$database = Config::get('database');
}
$this->config = array_merge($this->config, $config);
$this->database = array_merge($this->database, $database);
}
/**
* 打开Session
* @access public
* @param string $save_path
* @param mixed $session_name
* @return bool
* @throws Exception
*/
public function open($save_path, $session_name)
{
// 判断数据库配置是否可用
if(empty($this->database)){
throw new Exception('session error:database empty');
}
$this->handler = Db::connect($this->database);
$this->table_name = $this->database['prefix'] . $this->config['table_name'];
return true;
}
/**
* 关闭Session
* @access public
*/
public function close()
{
$this->gc(ini_get('session.gc_maxlifetime'));
$this->handler = null;
return true;
}
/**
* 读取Session
* @access public
* @param string $session_id
* @return bool|string
*/
public function read($session_id)
{
$where = [
'session_id' => $this->config['session_name'] . $session_id,
'expire_time' => time()
];
$sql = 'SELECT session_data FROM ' . $this->table_name . ' WHERE session_id = :session_id AND expire_time > :expire_time';
$result = $this->handler->query($sql, $where);
if(!empty($result)){
return $result[0]['session_data'];
}
return '';
}
/**
* 写入Session
* @access public
* @param string $session_id
* @param String $session_data
* @return bool
*/
public function write($session_id, $session_data)
{
$params = [
'session_id' => $this->config['session_name'] . $session_id,
'expire_time' => $this->config['expire_time'] + time(),
'session_data' => $session_data
];
$sql = 'REPLACE INTO ' . $this->table_name . ' (session_id, expire_time, session_data) VALUES (:session_id, :expire_time, :session_data)';
$result = $this->handler->execute($sql, $params);
return $result ? true : false;
}
/**
* 删除Session
* @access public
* @param string $session_id
* @return bool|void
*/
public function destroy($session_id)
{
$where = [
'session_id' => $this->config['session_name'] . $session_id
];
$sql = 'DELETE FROM ' . $this->table_name . ' WHERE session_id = :session_id';
$result = $this->handler->execute($sql, $where);
return $result ? true : false;
}
/**
* Session 垃圾回收
* @access public
* @param string $sessMaxLifeTime
* @return bool
*/
public function gc($sessMaxLifeTime)
{
$where = [
'expire_time' => time()
];
$sql = 'DELETE FROM ' . $this->table_name . ' WHERE expire_time < :expire_time';
return $this->handler->execute($sql, $where);
}
}把上面的文件保存为:Mysql.php
放在目录:/thinkphp/library/think/session/driver 下;
然后在配置文件中修改session的储存方式,文件位置 : /application/config.php
'session' => [ 'id' => '', // SESSION_ID的提交变量,解决flash上传跨域 'var_session_id' => '', // SESSION 前缀 'prefix' => 'think', // 驱动方式 支持redis memcache memcached 'type' => 'mysql', // 是否自动开启 SESSION 'auto_start' => true, // mysql 存session的表名 'table_name' => 'session', // 是否自动开启 SESSION ],
以上就是TP5把session存储到Mysql中的步骤
Dcr163的博客
http://dcr163.cn/223.html(转载时请注明本文出处及文章链接)