session_set_save_handler(callback open,callback close,callback read,call write,callback destroy,callback gc)
各個參數的的執行時機以及使用說明
回調函數
描述
open()
在運行session_start()時執行,該函數的聲明需要兩個參數,系統會自動的將php.ini中session.save_path選項值傳遞給第一個參數,將session名自動的傳遞到第二個參數中,返回true則繼續往下執行
close()
該函數不需要參數,在腳本執行完成或調用session_write_close(),session_destroy()時被執行,即在所有session操作完成後被執行,如果不需要處理直接返回true
read()
在運行session_start()時執行,因為在開啟會話時,會去read當前的session數據並且寫入$_SESSION變量。需要聲明一個參數,系統會自動的將SessionId傳遞給該函數,用於通過sessionId獲取對應的用戶數據,返回當前的用戶數據寫入$_SESSION數據
write()
該函數在腳本結束和對$_SESSION變量賦值時執行,需要聲明兩個參數,分別是sessionid和串行化後session信息字符串,在對$_SESSION變量賦值時,就可以通過Sessionid找到存儲位置,並且將信息寫入,存儲成功可以返回true繼續向下執行
destroy()
在運行session_destroy時執行,需要聲明一個參數,系統會自動將sessionId傳遞給該函數,去除對應的回話信息
gc()
垃圾回收程序啟動時執行。需要聲明一個參數,系統自動將php.ini中
session.gc_maxlifetime選項的值傳遞給該函數,用戶刪除超過這個時間的session信息,返回true可以繼續向下執行
Session入庫就是將session的信息保存到表中,需要設置session.save_handler = user
新建session表
DROP TABLE IF EXISTS `session`; CREATE TABLE `session` ( `sid` char(32) NOT NULL, `update_time` int(11) default NULL, `data` text, PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
需要存儲 sessionid ,更新時間,格式化數據
然後寫功能性代碼:
$link=mysql_connect("127.0.0.1","root","root");
mysql_select_db("session");
mysql_query("set names utf8");
function open($save_path,$session_name){
return true;
}
function close(){
return true;
}
function read($sid){
/*通過sid先從數據庫中查找當前用戶的信息*/
$sql="select * from session where sid='$sid'";
//echo $sql;
$re=mysql_query($sql);
/*如果沒有結果返回空字符串給$_SESSION變量*/
if(!$result=mysql_fetch_array($re)){
return "";
}
/*如果有數據返回結果*/
return $result["data"];
}
function write($sid,$data){
/*每次寫之前先從數據庫中獲取一下是否已經存在該用戶的session信息*/
$sql="select * from session where sid='$sid'";
$re=mysql_query($sql);
$time=time();
/*如果存在該用戶的信息則去修改,如果不存在要重新添加一行數據*/
if($result=mysql_fetch_array($re)){
//存在的情況
$sql1="update session set update_time='$time',data='$data' where sid='$sid'";
mysql_query($sql1);
}else{
//不存在的情況
if(!empty($data)){
$sql1="insert into session(sid,update_time,data) values('$sid','$time','$data')";
$sth1=mysql_query($sql1);
}
}
return true;
}
function destroy($sid){
//通過sessionid來刪除當前用戶的記錄
$sql="delete from session where sid='$sid'";
mysql_query($sql);
return true;
}
function gc($maxfiletime){
//通過sessionid來刪除當前用戶的記錄
$sql="delete * from session where update_time<$maxfiletime";
mysql_query($sql);
return true;
}
session_set_save_handler("open","close","read","write","destroy","gc");
session_start();
?>