关于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将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
PHP防止post重复提交数据的简单例子
Jun 07 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
PHP基于SMTP协议实现邮件发送实例代码
Apr 27 PHP
php 数组元素快速去重
May 05 PHP
php使用str_replace替换多维数组的实现方法分析
Jun 15 PHP
php实现小程序支付完整版
Oct 09 PHP
php原生数据库分页的代码实例
Feb 18 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 PHP
PHP实现页面静态化深入讲解
Mar 04 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 金额数字转换成英文
2010/05/06 PHP
PHP实现的同步推荐操作API接口案例分析
2016/11/30 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
PHP实现15位身份证号转18位的方法分析
2019/10/16 PHP
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
用js生产批量批处理执行命令
2008/07/28 Javascript
Javascript 读后台cookie代码
2008/09/15 Javascript
javascript 函数速查表
2010/02/07 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
jQuery 3.0 的 setter和getter 模式详解
2016/07/11 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
Vue自定义指令写法与个人理解
2019/02/09 Javascript
vue实现登录拦截
2020/06/29 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Django代码性能优化与Pycharm Profile使用详解
2018/08/26 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
python中id函数运行方式
2020/07/03 Python
python 常见的反爬虫策略
2020/09/27 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
单位工程竣工验收方案
2014/03/16 职场文书
环保倡议书范文
2014/05/12 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python