ecshop中的session机制
shop中的session不是php自带的session,而是自己制作了一个变量,模拟了SESSION了session的功能,然后这个变量也叫做$_SESSION。
ecshop中使用了includes/cls_session类来模拟session变量。
用PHP代码模拟session变量:
<?php
/**
* ecshop中的session机制和这段代码的原理相同,
* 不同之处:1. 封装了session类
* \ 2. 存在数据库中,我们是写在文件中
*/
$_SESSION = array();
// 先获取用户的sessionid
$sid = isset($_COOKIE['cz']['sess_id']) ? $_COOKIE['cz']['sess_id'] : null;
// 说明用户是第一次访问
if(!$sid)
{
// 生成唯一的文件名
$sid = md5(uniqid(microtime()));
// 生成文件用来存当前用户的session数据
touch('./session/'.$sid);
// 把sessionid存到cookie中
session数据错误是什么意思 setcookie('cz[sess_id]', $sid);
}
else
{
// 如果在服务器上已经有了对应的文件
// 从文件中取出session的值,放到$_SESSION
$_SESSION = file_get_contents('./session/'.$sid);
// 数组、对象存到文件、数据库(持久久)中时必须要序列化
// 从文件取出来之后必须要反序列化
$_SESSION = unserialize($_SESSION);
}
// 每次在脚本执行完之后把$_SESSION存回到文件中
// 注册一个函数,这个函数在脚本执行完之后自动调用
register_shutdown_function('update_session');
// 这个函数在脚本执行完之后自动执行
function update_session()
{
global $sid, $_SESSION;
// 把$_SESSION数据存回到文件中
file_put_contents(dirname(__FILE__).'/session/'.$sid, serialize($_SESSION));
// 偶尔调用这个函数,不要总是调用这个函数,这样可以减轻硬盘的IO
if(rand(1, 100) == 50)
gc();
}
// 自动删除服务器上过期的session文件
function gc()
{
// session的过期时间
$maxlifetime = ini_get('_maxlifetime');
$cur_dirl = dirname(__FILE__); // 获取当前PHP脚本所在目录
$dir = $cur_dirl.'/session/';
$cur_time = time();
// 循环遍历目录下所有的文件并删除过期文件
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if($file == '.' || $file == '..')
continue ;
if($cur_time - filemtime($dir.'/'.$file) > $maxlifetime)
unlink($dir.'/'.$file);
}
closedir($dh);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论