使用 PDO 方式将 Session 保存到 MySQL 数据中
类:
<?php
/* 使用数据库保存session */
class DBHandler implements SessionHandlerInterface {
protected $dbh;
public function open($save_path, $name) {
try {
$this->connect($save_path, $name);
return true;
} catch(PDOException $e) {
echo $e->getMessage();
return false;
}
}
public function close() {
return true;
}
public function destroy($session_id) {
$sth = $this->dbh->prepare("DELETE FROM sessions WHERE session_id = ?");
$sth->execute(array($session_id));
return true;
}
public function gc($maxlifetime) {
$sth = $this->dbh->prepare("DELETE FROM sessions WHERE last_update < ?");
$sth->execute(array(time() - $maxlifetime));
return true;
}
public function read($session_id) {
$sth = $this->dbh->prepare("SELECT session_data FROM sessions WHERE session_id = ?");
$sth->execute(array($session_id));
$row = $sth->fetch(PDO::FETCH_NUM);
if(count($row) == 0) {
return '';
} else {
return $row[0];
}
}
public function write($session_id, $session_data) {
date_default_timezone_set('PRC');
$now = time();
$sth = $this->dbh->prepare("UPDATE sessions SET session_data = ?,
last_update = ? WHERE session_id = ?");
$sth->execute(array($session_data, $now, $session_id));
if($sth->rowCount() == 0) {
$sth2 = $this->dbh->prepare("INSERT INTO sessions (session_id, session_data, last_update) VALUES (?,?,?)");
$sth2->execute(array($session_id, $session_data, $now));
}
}
public function createTable($save_path, $name, $connect = true) {
if($connect) {
$this->connect($save_path, $name);
}
$sql =<<<_SQL_
CREATE TABLE sessions (
session_id VARCHAR(64) NOT NULL,
session_data MEDIUMTEXT NOT NULL,
last_update INT NOT NULL,
PRIMARY KEY (session_id)
)
_SQL_;
$this->dbh->exec($sql);
}
public function connect($save_path) {
$parts = parse_url($save_path);
parse_str($parts['query'], $query);
//$dsn格式:mysql:host=localhost;dbname=test
$dsn = $parts['scheme'].":host=".$parts['host'].";dbname=".$query['dbname'];
$user = $query['user'];
$password = $query['password'];
$this->dbh = new PDO($dsn, $user, $password);
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$this->dbh->query('SELECT 1 FROM sessions LIMIT 1');
} catch(Exception $e) {
$this->createTable($save_path, NULL, false);
}
}
}
使用:
<?php
include './db.php';
ini_set('session.save_path', "mysql://localhost?user=root&password=&dbname=test");
ini_set('session.gc_maxlifetime', 5);
ini_set('session.gc_divisor', 2);
session_set_save_handler(new DBHandler);
session_start();
if(! isset($_SESSION['visits'])) {
$_SESSION['visits'] = 0;
}
$_SESSION['visits']++;
echo '你是第 '.$_SESSION['visits'].' 次访问';
参考:
<PHP Cookbook>3'rd
使用 PDO 方式将 Session 保存到 MySQL 数据中的更多相关文章
- 利用session_set_save_handler()函数将session保存到MySQL数据库中
PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...
- node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中
步骤一:安装必要模块 (1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器. (2)request模块,让http请求变的更加简单 (3)mysql模块,node连接mysq ...
- Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:
创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...
- Asp.net Session 保存到MySql中
一 网站项目引入"mysql.web.dll" 二 web.config配置中添加mysql数据库连接字符串 <connectionStrings> <remov ...
- Springboot 2.1.1.RELEASE 版本 session保存到MySQL里面
1,pom.xml添加依赖: <!-- 数据库session管理 --> <dependency> <groupId>org.springframework.ses ...
- php 保存到mysql数据库中的中文乱码
近期又php项目,乱码是个头痛的问题 解决方法: 1,php 文件中 添加 header(“Content-Type: text/html; charset=utf-8"); 2,需要做数据 ...
- PHP如何将session保存到memcached中?如何分布式保存PHP session
session_set_save_handler无关的memcached保存session的方法 在memcached服务器上 1)下载memcached #wget http://memcached ...
- php将图片以二进制保存到mysql数据库并显示
一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_I ...
- Python scrapy爬虫数据保存到MySQL数据库
除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 ...
随机推荐
- 字符串专题:map POJ 1002
第一次用到是在‘校内赛总结’扫地那道题里面,大同小异 map<string,int>str 可以专用做做字符串的匹配之类的处理 string donser; str [donser]++ ...
- yii2事务运用举例
直接上代码: $db = Yii::$app->db; $transaction = $db->beginTransaction(); //开启事务 try { // 更新member表 ...
- struts2 国际化
国际化概述: 软件国际化:一个软件根据来访者地区不同,显示不同语言. 国际化: * 必须有一组资源包: * 一组属性文件命名: 基本名称_语言(小写)_国家(大写).properties * 如:me ...
- JVM内存管理------垃圾搜集器精解(让你在垃圾搜集器的世界里耍的游刃有余)
引言 在上一章我们已经探讨过hotspot上垃圾搜集器的实现,一共有六种实现六种组合.本次LZ与各位一起探讨下这六种搜集器各自的威力以及组合的威力如何. 为了方便各位的观看与对比,LZ决定采用当初写设 ...
- iOS10 SiriKit QQ适配详解
原文连接 1. 概述 苹果在 iOS10 开放了 SiriKit 接口给第三方应用.目前,QQ已经率先适配了 Siri 的发消息和打电话功能.这意味着在 iOS10 中你可以直接告诉 Siri 让它帮 ...
- (转)Oracle 获取上周一到周末日期的查询sql语句
-- Oracle 取上周一到周末的sql -- 这样取的是 在一周内第几天,是以周日为开始的 select to_char(to_date('20130906','yyyymmdd'),'d') f ...
- Power BI for Office 365(四)Power View第一部分
Power View是一种可以创建动态的交互式报表的工具,并且支持丰富多样的图表类型,在Power View中创建的报表可以很容易地进行分享,以及供查看报表的用户对Power View报表进行交互.从 ...
- [译]:Orchard入门——使用WebMatrix管理Orchard网站
原文链接:Working with Orchard in WebMatrix WebMatrix--微软一站式Web开发工具,包括网站的创建.编辑以及发布--不过现在微软更推荐VS code .Web ...
- npm 安装不了模块
npm install 不能安装模块 先卸载npm,然后再重新安装 sudo npm uninstall npm -g 如果上面卸载不了,则进入到npm的安装目录(which npm): sudo m ...
- 【淘淘】Quartz作业存储与管理
一.Quartz作业管理和存储方式简介: 作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数.如果你的作业是30分钟后或每30秒调用,这不是很有用.事实上,作业执行需要非常准确和即时调用在被调 ...