关于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 相关文章推荐
回答PHPCHINA上的几个问题:URL映射
Feb 14 PHP
php日历[测试通过]
Mar 27 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
PHP日期时间函数的高级应用技巧
May 16 PHP
php 将bmp图片转为jpg等其他任意格式的图片
Jun 29 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
Sep 10 PHP
php代码检查代理ip的有效性
Aug 19 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
Aug 30 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
PHP实现的微信公众号扫码模拟登录功能示例
May 30 PHP
Smarty模板类内部原理实例分析
Jul 03 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
风格模板初级不完全修改教程
2006/10/09 PHP
mysql limit查询优化分析
2008/11/12 PHP
php 404错误页面实现代码
2009/06/22 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
PHP源码之explode使用说明
2011/08/05 PHP
php中smarty区域循环的方法
2015/06/11 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
yii2-GridView在开发中常用的功能及技巧总结
2017/01/07 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
jQuery Tools tooltip使用说明
2012/07/14 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
vue数据传递--我有特殊的实现技巧
2018/03/20 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
2018/08/24 jQuery
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
MySQL适配器PyMySQL详解
2017/09/20 Python
详解Python中的四种队列
2018/05/21 Python
python事件驱动event实现详解
2018/11/21 Python
Pytorch 实现权重初始化
2019/12/31 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
HTML5中的autofocus(自动聚焦)属性介绍
2014/04/23 HTML / CSS
餐饮业会计岗位职责
2013/12/19 职场文书
学子宴答谢词
2014/01/25 职场文书
2014年调度员工作总结
2014/11/19 职场文书
初三语文教学计划
2015/01/22 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python
SQL Server远程连接的设置步骤(图文)
2022/03/23 SQL Server