微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于PHP session 存储方式的详细介绍

PHP为sesion的存储提供了三种方式: 文件/ 内存/ 自定义存储,认是使用文件存储.

在访问量大的网站上采用这种方式就不大合适,因为这样会导致大量的输入输出的冗余.
下面介绍一种基于MysqL数据库的session存储方式.

首先要进行的配置如下:

PHP.ini中将session.save_handler = files 中的files改为User,其他认即可,重启Apache(好像没改也行啊)
本实例创建的数据库名叫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") //选择数据库之前需要先连接数据库服务器
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") //选择数据库之前需要先连接数据库服务器
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") //选择数据库之前需要先连接数据库服务器
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") //选择数据库之前需要先连接数据库服务器
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']."
";
echo "PassWord:".$_SESSION['password']."
";
?>

附加一个小经历: 有天莫名的再存储session的时候发现页面报这个错
Failed to initialize storage module
后来找了相关资料后才知道是我的session存储采用数据库文件存储,而session_start()时,我的数据库还没醒来...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐