关于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 5.0对象模型深度探索之绑定
Sep 05 PHP
PHP中的日期处理方法集锦
Jan 02 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
php实现简单的MVC框架实例
Sep 23 PHP
PHP微信开发之有道翻译
Jun 23 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
php抽象类和接口知识点整理总结
Aug 02 PHP
php面试实现反射注入的详细方法
Sep 30 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
php+laravel 扫码二维码签到功能
May 15 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
让你同时上传 1000 个文件 (一)
2006/10/09 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
js图片预加载示例
2014/04/30 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
scrapy结合selenium解析动态页面的实现
2020/09/28 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
学生档案自我鉴定
2013/10/07 职场文书
大学生毕业自我评价范文分享
2013/11/07 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
《雕塑之美》教学反思
2014/04/24 职场文书
小组名称和口号
2014/06/09 职场文书
护士实习求职信
2014/06/22 职场文书
黄山导游词
2015/01/31 职场文书
学校端午节活动总结
2015/02/11 职场文书