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(); ?>