/**
* 【session.save_handler = files】:默认的session处理机制
* (1)session_start()是session机制的开始,它有必定几率开启垃圾回收,由于session是存放在文件中,PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个几率是根据php.ini的配置决定的,
可是有的系统是 session.gc_probability = 0,这也就是说几率是0,而是经过cron脚原本实现垃圾回收
session.gc_probability = 1 //垃圾回收机制
session.gc_divisor = 1000 //垃圾回收机制
session.gc_maxlifetime = 1440//过时时间 默认24分钟
//垃圾回收的概率为:session.gc_probability/session.gc_divisor,即:1/1000,
//不建议设置太小,由于session的垃圾回收,是须要检查每一个文件是否过时的。
session.save_path = //好像不一样的系统默认不同,有一种设置是 "N;/path"
//这是随机分级存储,这个样的话,垃圾回收将不起做用,须要本身写脚本
* (2)session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值;这个值能够从php.ini找到,session.name = PHPSESSID //默认值PHPSESSID
* (3)若是不存在会生成一个session_id,而后把生成的session_id做为COOKIE的值传递到客户端;至关于执行了下面COOKIE 操做,注意的是,这一步执行了setcookie()操做,COOKIE是在header头中发送的,
* 这以前是不能有输出的,PHP有另一个函数 session_regenerate_id() 若是使用这个函数,这以前也是不能有输出的
setcookie(
session_name(),//PHPSESSID,对应php.ini中session.name = PHPSESSID配置选项
session_id(), //生成的session_id值
session.cookie_lifetime,//默认0
session.cookie_path,//默认'/'当前程序跟目录下都有效
session.cookie_domain,//默认为空
)
* (4)若是存在session_id,那么session_id = $_COOKIE[session_name];而后去session.save_path指定的文件夹里去找名字为'SESS_'. session_id()的文件,读取文件的内容反序列化,而后放到$_SESSION中
* (5)为$_SESSION赋值:
* 好比新添加一个值$_SESSION['test'] = 'blah';那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,会把$_SESSION的值写入到session_id指定的文件夹中,而后关闭相关资源
这个阶段有可能执行更改session_id的操做,好比销毁一个旧的的session_id,生成一个全新的session_id.
if (isset($_COOKIE[session_name()])) {//如:匿名用户有一个SESSION的,当它登陆后须要换用新的session_id
setcookie(session_name(), '', time() - 42000, '/');//旧session cookie过时
}
session_regenerate_id();//这一步会生成新的session_id,此时再经过session_id()返回的是新的值
* (6)写入SESSION:在脚本结束的时候会执行SESSION写入操做,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,可能须要建立新的文件
* (7)销毁SESSION:SESSION发出去的COOKIE通常属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过时,假如须要人为强制过时,好比 退出登陆,而不是关闭浏览器,那么就须要在代码里销毁SESSION,方法有不少:
setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登陆前执行
usset($_SESSION);//这会删除全部的$_SESSION数据,刷新后,有COOKIE传过来,可是没有数据
session_destroy();//这个做用更完全,删除$_SESSION 删除session文件,和session_id
*
* 【session.save_handler = user】:用户自定义session处理机制
* (1)用户自定义session处理机制:session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');//【执行此函数将修改session默认的存储介质;修改是隐式的,因此不会体如今php.ini配置文件中的session.save_handler配置项】
session_start():
执行open($save_path, $session_name)打开session操做句柄,$save_path 在session.save_handler = files的状况下它就是session.save_path;可是若是用户自定的话,这个两个参数都用不上,直接返回TRUE
执行read($id)从中读取数据.//【这个参数是自动传递的就是session_id()】,能够经过这个值进行操做
(2)脚本执行结束:执行write($id, $sess_data) //两个参数,很简单
(3)假如用户须要session_destroy(),先执行destroy.在执行第2步
(4)案例:
//SESSION初始化的时候调用
function open($save_path, $session_name){
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
//关闭的时候调用
function close(){
return(true);
}
function read($id){//【参数会自动传递,就是session_id()】
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
//脚本执行结束以前,执行写入操做
function write($id, $sess_data){//【参数会自动传递,就是session_id()】
echo "sdfsf";
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
function destroy($id){//【参数会自动传递,就是session_id()】
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
function gc($maxlifetime){
global $sess_save_path;
foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) + $maxlifetime
@unlink($filename);
}
}
return true;
}
?>
*
*/
//【session.save_handler = user】:用户自定义session处理机制
$SESS_DBHOST = "127.0.0.1";
$SESS_DBNAME = "cms";
$SESS_DBUSER = "root";
$SESS_DBPASS = "";
$SESS_DBH = ""; //数据库链接句柄
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");//默认:8M
//SESSION初始化的时候调用
function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
echo "
Can't connect to $SESS_DBHOST as $SESS_DBUSER";echo "
MySQL Error: " . mysql_error();die;
}
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
echo "
Unable to select database $SESS_DBNAME";die;
}
return true;
}
//关闭的时候调用
function sess_close() {
return true;
}
function sess_read($key) {
global $SESS_DBH, $SESS_LIFE;
$qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH);
if (list($value) = mysql_fetch_row($qid)) {
return $value;
}
return false;
}
//脚本执行结束以前,执行写入操做
function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;
$expiry = time() + $SESS_LIFE; //过时时间
$value = addslashes($val);
$qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";
$qid = mysql_query($qry, $SESS_DBH);
if (! $qid) {
$qry = "UPDATE session_tbl SET expiry = $expiry, value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH);
}
return $qid;
}
function sess_destroy($key) {
global $SESS_DBH;
$qry = "DELETE FROM session_tbl WHERE sesskey = '$key'";
$qid = mysql_query($qry, $SESS_DBH);
return $qid;
}
function sess_gc($maxlifetime) {
global $SESS_DBH;
$qry = "DELETE FROM session_tbl WHERE expiry
$qid = mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH);
}
//【session.save_handler = user】:用户自定义session处理机制主要是经过session_set_save_handler()来进行协调执行
//【执行此函数将修改session默认的存储介质;修改是隐式的,因此不会体如今php.ini配置文件中的session.save_handler配置项】
session_set_save_handler(
"sess_open", //能够进行重写
"sess_close", //能够进行重写
"sess_read", //能够进行重写
"sess_write", //能够进行重写
"sess_destroy", //能够进行重写
"sess_gc" //能够进行重写
);
session_start(); //除了以上被重写的session函数外,其它的session函数仍是想之前同样调用
?>