关于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 06 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
Jun 20 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
PHP中$this和$that指针使用实例
Jan 06 PHP
php rsa加密解密使用详解
Jan 14 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
laravel实现前后台路由分离的方法
Oct 13 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获取域名的google收录示例
2014/03/24 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
JS字符串函数扩展代码
2011/09/13 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
vue监听dom大小改变案例
2020/07/29 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python 命令行传入参数实现解析
2019/08/30 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python 读取数据库并绘图的实例
2019/12/03 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
旅游管理专业个人求职信范文
2013/12/24 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python