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);
    }
}