关于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 相关文章推荐
mysql 搜索之简单应用
Apr 27 PHP
php读取数据库信息的几种方法
May 24 PHP
php数据库密码的找回的步骤
Jan 12 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
Apr 17 PHP
PHP is_array() 检测变量是否是数组的实现方法
Jun 13 PHP
php封装的验证码工具类完整实例
Oct 19 PHP
golang 调用 php7详解及实例
Jan 04 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
May 29 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 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修改文件上传限制方法汇总
2015/04/07 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
2012/03/15 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
用原生js做单页应用
2017/01/17 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
通过jquery.cookie.js实现记住用户名、密码登录功能
2018/06/20 jQuery
JS实现的对象去重功能示例
2019/06/04 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
Python常用模块用法分析
2014/09/08 Python
Python手机号码归属地查询代码
2016/05/04 Python
python获取本机所有IP地址的方法
2018/12/26 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
python开发游戏的前期准备
2019/05/05 Python
Django ImageFiled上传照片并显示的方法
2019/07/28 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
eBay奥地利站:eBay.at
2019/07/24 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
班组长岗位职责范本
2014/01/05 职场文书
初一体育教学反思
2014/01/29 职场文书
公司司机岗位职责
2014/02/07 职场文书
Python中glob库实现文件名的匹配
2021/06/18 Python
Python基础之变量的相关知识总结
2021/06/23 Python
Python 中的Sympy详细使用
2021/08/07 Python