您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

ThinkPHP 5.0添加mysql存session驱动

时间:2019-10-24 11:50:03  来源:  作者:

php中Session默认都是用文件存储的,thinkphp是提供了redis和Memcache的存储类,但是没有提供MySQL的储存类,现在修改为用数据库的方式储存,直接上代码:

<?php
/**
 * session 存mysql类
 * dcr163.cn
 */
namespace thinksessiondriver;
use SessionHandler;
use thinkDb;
use thinkConfig;
use thinkException;
/**
 * 数据库方式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中的步骤,这时打开页面就可以看到session已经存到mysql表里了



Tags:ThinkPHP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
大家好,我是小蜗牛,今天给大家分享一下,如何用ThinkPHP5.1.*版本实现定时任务,例如凌晨12点更新数据、每隔10秒检测过期会员、每隔几分钟发送请求保证ip的活性等本次分享,主要用...【详细内容】
2020-10-22  Tags: ThinkPHP  点击:(339)  评论:(0)  加入收藏
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,可以支持Windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及P...【详细内容】
2020-09-04  Tags: ThinkPHP  点击:(125)  评论:(0)  加入收藏
ThinkPHP诞生于2006年,是一个国产开源的PHP开发框架,其借鉴了Struts框架的Action对象,同时也使用面向对象的开发结构和MVC模式。ThinkPHP可在Windows和Linux等操作系统运行,支持MySql,Sqlite和PostgreSQL等多种数据库以及P...【详细内容】
2020-09-03  Tags: ThinkPHP  点击:(298)  评论:(0)  加入收藏
前言作为一个Web菜鸡,我之前和师傅们参加了红帽杯,奈何只有0输出,当时只知道是thinkphp5.2的反序列化漏洞,但是感觉时间不够了,也就没有继续做下去。只有赛后来查漏补缺了,也借...【详细内容】
2020-07-19  Tags: ThinkPHP  点击:(116)  评论:(0)  加入收藏
前言ThinkPhp是目前主流的一款php语言框架,但在使用中,也是产生了很多的高危漏洞。本文小编将从Thinkphp3说起,说明一些tp3框架的漏洞产生原理。使广大爱好者进一步深刻的理解...【详细内容】
2020-05-06  Tags: ThinkPHP  点击:(142)  评论:(0)  加入收藏
ThinkPHP5的环境要求如下:PHP >= 5.4.0PDO PHP ExtensionMBstring PHP ExtensionCURL PHP Extension严格来说,ThinkPHP无需安装过程,这里所说的安装其实就是把ThinkPHP框架放入...【详细内容】
2020-03-17  Tags: ThinkPHP  点击:(71)  评论:(0)  加入收藏
thinkphp6环境要求php >= 7.1.0,而且必须通过composer方式安装和更新,当然,上一篇教程我们已经安装好了,而且默认安装的php版本是php7.3.4,符合环境要求。那么什么是composer呢?co...【详细内容】
2020-03-15  Tags: ThinkPHP  点击:(149)  评论:(0)  加入收藏
首先介绍下在本文出现的几个比较重要的概念:函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计...【详细内容】
2020-03-09  Tags: ThinkPHP  点击:(61)  评论:(0)  加入收藏
ThinkPHP6正式发布已有一小段时间,按照官方文档实操了一遍。中间也遇到些小问题,在网上找解决方案花费了一些时间。本次分享整理了ThinkPHP6从头开始部署的详细操作步骤,希...【详细内容】
2020-01-06  Tags: ThinkPHP  点击:(382)  评论:(0)  加入收藏
Thinkphp是目前最主流的php轻量型框架之一,作为一个功能完备的php框架,它里面内置了许多的配置,通过修改这些系统的设置可以很方便的对thinkphp的一些内容进行修改,本文总结了一...【详细内容】
2019-11-27  Tags: ThinkPHP  点击:(72)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(41)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(65)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(129)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条