关于PHP session 存储方式的详细介绍


Posted in PHP onJune 25, 2013

PHP为sesion的存储提供了三种方式: 文件/ 内存/ 自定义存储,默认是使用文件存储.在访问量大的网站上采用这种方式就不大合适,因为这样会导致大量的输入输出的冗余.
下面介绍一种基于Mysql数据库的session存储方式.
首先要进行的配置如下:
1>php.ini中将session.save_handler = files 中的files改为User,其他默认即可,重启Apache(好像没改也行啊)
2>本实例创建的数据库名叫php,    username: root        password:root
本实例设计的数据库的表结构如下所示:

create table mysession(
session_key char(32) not null,     
session_data text,
session_expiry int(11),
primary key(session_key)
);

第一列表示存储session ID,第二列存储session中的数据,第三列存储有效期,呵呵(表结构就这么简单)
下面就是关键的那份自定义函数的实现session_set_save_handler(......)
<?php
function mysession_open($save_path, $session_name)
{
@mysql_connect("localhost", "root", "root")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("php")      //选择数据库mydb
or die("数据库不存在或不可用");
return true;
}
function mysession_close()
{
return true;
}
function mysession_read($key)
{
@mysql_connect("localhost", "root", "root")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("php")      //选择数据库mydb
or die("数据库不存在或不可用");
$expiry_time = time();       //获取Session失效时间
//执行SQL语句获得Session的值
$query = @mysql_query("select session_data from mysession "
."where session_key = '$key' and session_expiry > $expiry_time")
or die("SQL语句执行失败");
if($row = mysql_fetch_array($query))
return $row['session_data'];
else
return false;
}
function mysession_write($key, $data)
{
@mysql_connect("localhost", "root", "root")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("php")      //选择数据库mydb
or die("数据库不存在或不可用");
$expiry_time = time() + 1200;       //获取Session失效时间
//查询Session的键值是否已经存在
$query = @mysql_query("select session_data from mysession "
."where session_key = '$key'")
or die("SQL语句执行失败");
//如果不存在,则执行插入操作,否则执行更新操作
if(mysql_numrows($query) == 0)
{ 
//执行SQL语句插入Session的值
$query = @mysql_query("insert into mysession values('$key', '$data', $expiry_time)")
or die("SQL语句执行失败");
}
else
{
//执行SQL语句更新Session的值
$query = @mysql_query("update mysession set "
."session_data = '$data', session_expiry = $expiry_time "
."where session_key = '$key'")
or die("SQL语句执行失败");
}
return $query;
}
function mysession_destroy($key)
{
@mysql_connect("localhost", "root", "root")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("php")      //选择数据库mydb
or die("数据库不存在或不可用");
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_key = '$key'")
or die("SQL语句执行失败");
return $query;
}
function mysession_gc($expiry_time)
{
@mysql_connect("localhost", "root", "root")     //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("php")      //选择数据库mydb
or die("数据库不存在或不可用");
$expiry_time = time();
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_expiry < $expiry_time")
or die("SQL语句执行失败");
return $query;
}
//设置用户自定义Session存储
session_set_save_handler('mysession_open',
'mysession_close',
'mysession_read',
'mysession_write',
'mysession_destroy',
'mysession_gc');
?>

最后面就是测试代码
1>存储页面 save.php
<?php
include('user-define-session-inc.php');   //包含session_set_save_handler定义的文件
session_start();
$_SESSION['username'] = "Simon";
$_SESSION['password'] = "123456";
?>

2. 显示页面 show.php
<?php
include('user-define-session-inc.php');   //包含session_set_save_handler定义的文件
session_start();
echo "UserName:".$_SESSION['username']."<BR>";
echo "PassWord:".$_SESSION['password']."<BR>";
?>

附加一个小经历: 有天莫名的再存储session的时候发现页面报这个错
Failed to initialize storage module
后来找了相关资料后才知道是我的session存储采用数据库文件存储,而session_start()时,我的数据库还没醒来...
PHP 相关文章推荐
随时给自己贴的图片加文字的php代码
Mar 08 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
深入PHP许愿墙模块功能分析
Jun 25 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
Aug 21 PHP
PHP中使用数组指针函数操作数组示例
Nov 19 PHP
PHP中filter函数校验数据的方法详解
Jul 31 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP十六进制颜色随机生成器功能示例
Jul 24 PHP
Cookie跨域问题解决方案代码示例
Nov 24 PHP
基于php使用memcache存储session的详解
Jun 25 #PHP
解析Extjs与php数据交互(增删查改)
Jun 25 #PHP
深入extjs与php参数交互的详解
Jun 25 #PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 #PHP
关于js与php互相传值的介绍
Jun 25 #PHP
探讨:如何使用PhpDocumentor生成文档
Jun 25 #PHP
关于PHPDocument 代码注释规范的总结
Jun 25 #PHP
You might like
4.与数据库的连接
2006/10/09 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
jquery一般方法介绍 入门参考
2011/06/21 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
layui table 参数设置方法
2018/08/14 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
JS如何把字符串转换成json
2020/02/21 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
python爬虫框架talonspider简单介绍
2017/06/09 Python
Flask之flask-script模块使用
2018/07/26 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
Python配置文件处理的方法教程
2019/08/29 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
2020/05/11 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
医务人员竞聘职务自我评价分享
2013/11/08 职场文书
安全生产责任书范本
2014/04/15 职场文书
政府门卫岗位职责
2014/04/29 职场文书
无毒社区工作方案
2014/05/23 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
计划生育工作汇报
2014/10/28 职场文书
法律意见书范文
2015/06/04 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis
Golang 实现WebSockets
2022/04/24 Golang