我们先来看一下cls_seesion类是如何被调用的:一个最简单的例子是通过admin/index.php进入到admin/includes/init.php,在init.php我们可以找到如下代码:
require(ROOT_PATH . 'includes/cls_session.php');
/*
$db 数据库对象
$ecs->table('sessions')=>`ecshop`.`ecs_sessions`//数据库名.数据表名
$ecs->table('sessions_data')=>`ecshop`.`ecs_sessions_data`
'ECSCP_ID'=>session名称
*/
$sess = new cls_session($db, $ecs->table('sessions'), $ecs->table('sessions_data'), 'ECSCP_ID');
所以,cls_session类是完成初始化工作的一部分。它的功能主要是在客户端生成cookie,进行session的验证,并把一些会话数据插入到数据库中。下面我们来研究每段代码的执行流程以及实现的功能:
//下面的判断语句是为了防止通过地址直接访问该页面
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
class cls_session
{
var $db = NULL;//数据库连接资源句柄
var $session_table = '';//会话表名:ecs_session
var $max_life_time = 1800; // SESSION 生命周期
var $session_name = '';//会话名:在客户端表示为ESCCP_ID
var $session_id = '';//会话ID
var $session_expiry = '';//会话过期时间戳
var $session_md5 = '';
//下面的三个参数都为setcookie中的参数
var $session_cookie_path = '/';
var $session_cookie_domain = '';
var $session_cookie_secure = false;
var $_ip = '';//客户端真实IP
var $_time = 0;//当前时间
function __construct(&$db, $session_table, $session_data_table, $session_name = 'ECS_ID', $session_id = '')
{
$this->cls_session($db, $session_table, $session_data_table, $session_name, $session_id);
}
//构造方法
function cls_session(&$db, $session_table, $session_data_table, $session_name = 'ECS_ID', $session_id = '')
{
$GLOBALS['_SESSION'] = array();//定义一个全局的_SESSION数组变量
//下面的三个条件语句都是为了给setcookie函数的三个参数做初始化工作
//cookie在服务器端的有效路径如果该参数设为"/",则它在整个
//domain(域)内有效,若设为"/11",它就在domain下的/11目录及其子目录内有效,默认为当前目录
if (!empty($GLOBALS['cookie_path']))//$GLOBALS['cookie_path']='/'
{
$this->session_cookie_path = $GLOBALS['cookie_path'];
}
else
{
$this->session_cookie_path = '/';
}
//cookie的有效域名
if (!empty($GLOBALS['cookie_domain']))//$GLOBALS['cookie_domain']=''
{
$this->session_cookie_domain = $GLOBALS['cookie_domain'];
}
else
{
$this->session_cookie_domain = '';
}
//cookie的安全传输方式,1为https,0为http或https