关于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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
PHP文件读取功能的应用实例
May 08 PHP
php反射类ReflectionClass用法分析
May 12 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP中命名空间的使用例子
Mar 22 PHP
php常用的工具开发整理
Sep 26 PHP
PHP连接SQL server数据库测试脚本运行实例
Aug 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一个找二层目录的小东东
2012/08/02 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
JS版网站风格切换实例代码
2008/10/06 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
利用node.js实现自动生成前端项目组件的方法详解
2017/07/12 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
Python分析学校四六级过关情况
2017/11/22 Python
图解Python变量与赋值
2018/04/03 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
pyshp创建shp点文件的方法
2018/12/31 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
pytorch标签转onehot形式实例
2020/01/02 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
GNC健安喜官方海外旗舰店:美国著名保健品牌
2017/01/04 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
先进党支部事迹材料
2014/01/13 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
静心口服夜广告词
2014/03/20 职场文书
党风廉政教育心得体会2016
2016/01/22 职场文书
mysql中整数数据类型tinyint详解
2021/12/06 MySQL