关于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扩展开发经验分享
Sep 06 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
一个简单至极的PHP缓存类代码
Oct 23 PHP
PHP的Yii框架的常用日志操作总结
Dec 08 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
May 06 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
Oct 23 PHP
php微信公众号开发之现金红包
Apr 16 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP实现考试倒计时功能代码
Apr 16 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中设置index.php文件为只读的方法
2013/02/06 PHP
jquery创建div 实现代码
2009/04/27 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
提高Node.js性能的应用技巧分享
2017/08/10 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
微信小程序之自定义组件的实现代码(附源码)
2018/08/02 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
python导入模块交叉引用的方法
2019/01/19 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
python输出带颜色字体实例方法
2019/09/01 Python
python logging日志模块原理及操作解析
2019/10/12 Python
什么是python类属性
2020/06/10 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
采购主管岗位职责
2014/02/01 职场文书
村委会贫困证明范本
2014/09/17 职场文书
紧急迫降观后感
2015/06/15 职场文书
务工证明怎么写
2015/06/18 职场文书
党员心得体会范文2016
2016/01/23 职场文书
微信小程序实现聊天室功能
2021/06/14 Javascript
Nginx进程调度问题详解
2021/09/25 Servers
在Centos 8.0中安装Redis服务器的教程详解
2022/03/21 Redis