关于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的异常处理类Exception的使用及说明
Jun 13 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
php技术实现加载字体并保存成图片
Jul 27 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
详解PHP归并排序的实现
Oct 18 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
PHP中rename()函数的妙用讲解
Feb 28 PHP
Thinkphp整合阿里云OSS图片上传实例代码
Apr 28 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 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
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
javascript radio 联动效果
2009/03/04 Javascript
兼容IE与firefox火狐的回车事件(js与jquery)
2010/10/20 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
js中less常用的方法小结
2017/08/09 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
Python urlopen 使用小示例
2008/09/06 Python
pydev使用wxpython找不到路径的解决方法
2013/02/10 Python
python中去空格函数的用法
2014/08/21 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python字符串的常见操作实例小结
2019/04/08 Python
python找出列表中大于某个阈值的数据段示例
2019/11/24 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
计算机专业毕业生的自我评价
2013/11/18 职场文书
给校长的建议书400字
2014/05/15 职场文书
银行求职信
2014/05/31 职场文书
市场营销毕业求职信
2014/08/07 职场文书
妇女工作先进事迹
2014/08/17 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
客户经理岗位职责
2015/01/31 职场文书
关于远足的感想
2015/08/10 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL