关于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 相关文章推荐
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
php 面试碰到过的问题 在此做下记录
Jun 09 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
Win下如何安装PHP的APC拓展
Aug 07 PHP
PHP多态代码实例
Jun 26 PHP
PHP+MySQL实现无极限分类栏目的方法
Dec 23 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 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 身份验证方面的函数
2009/10/11 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
js输出列表实现代码
2010/09/12 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
js三种排序算法分享
2012/08/16 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
Windows下PyMongo下载及安装教程
2015/04/27 Python
Python打印斐波拉契数列实例
2015/07/07 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
2018/05/08 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
利用Python复制文件的9种方法总结
2019/09/02 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
Pycharm小白级简单使用教程
2020/01/08 Python
python numpy 矩阵堆叠实例
2020/01/17 Python
python能开发游戏吗
2020/06/11 Python
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
市场部管理制度
2014/02/02 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers