這篇文章主要介紹的內容是關於理解PHP的SESSION機制,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
一、預設機制,用磁碟檔案來實作PHP會話。 php.ini設定:session##.save_handler = files
# 1 、session_start()
A、 session_start()是session機制的開始,它有一定機率開啟垃圾回收, 因為session是存放在檔案中, PHP本身的垃圾回收是無效的,SESSION的回收是要刪檔案的,這個機率是根據php
. ini的配置決定的, 但是有的系統是session
.gc_probability ##=0##gc_probability ##=##0
##,這也就是說機率是0,而是透過cron腳本來實現垃圾回收。
session.gc_probability =# #1 #.gc_pisor ##=
1000 session#o#.
##編號#編號#_編號#_編號#3#編號#編號#編號#編號#編號#編號#3#編號#編號#3#編號#3#編號#」 =1440
//過期時間預設24分鐘
//機率為session.gc_probability/session.gc_sorpi7/1/10 ## //不建議設定太小,因為session的垃圾回收,是需要檢查每個檔案是否過期的。 session.save_path =
/#save_path
#好像不同的系統預設不一樣,有一種設定是"N;/path" //這是隨機分級存儲,這樣的話,垃圾回收將不起作用,需要自己寫腳本
B、 session會判斷目前是否有$_COOKIE#[session_name#$_COOKIE
####[######session_name# #####()];######session_name######()傳回儲存session_id的COOKIE鍵值,###這個值可以從php.ini找到
session.name = PHPSESSID //默認值PHPSESSID
C 、 如果不存在會產生一個session_id,#然後把產生的session_id當作COOKIE的值傳遞到客戶端.
相當於執行了下面COOKIE 操作,注意的是,這一步執行了setcookie()操作,COOKIE是在header頭中發送的,
這之前是不能另外有輸出的,PHP]這之前是不能有輸出的,PHP 這之前是不能有輸出的,PHP 這之前是不能有輸出的,PHP.一個函數 session_regenerate_id() 如果使用這個函數,這之前也是不能有輸出的。
setcookie(session_name(),
#session_id##1 session.cookie_lifetime
###############################。 ###,######//######預設0################ ######,######//######預設'/'目前程式跟目錄下都有效############### ####.######cookie_domain######,######//######預設為空############# # )且為########################################################################################### D、 如果存在那麼session_id =$_COOKIE##[session_name##];# 然後去session
.save_path指定的資料夾裡去找名字為'SESS_##'.session_id()的檔案. 讀取檔案的內容反序列化,然後放到$_SESSION中
# 2
、 為$_SESSION賦值 例如新加入一個值$_SESSION
[#'#test'] ='#blah'; 那麼這個$_SESSION只會維護在記憶體中,當腳本執行結束的時候, 用把$_SESSION的值寫入到session_id指定的資料夾中
,然後關閉相關資源. 這個階段有可能執行更改session_id的操作, 例如銷毀一個舊的的session_id,產生一個全新的session_id.
一半用在自訂session操作,角色的轉換上, 例如Drupal.
Drupal的匿名使用者有一個SESSION的,當它登入後需要換用新的session_id if (isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time() -42000,'/');//旧session cookie过期
}
session_regenerate_id();//这一步会生成新的session_id
//session_id()返回的是新的值
##、 相关推荐:
寫入SESSION操作 在腳本結束的時候會執行SESSION寫入操作,把$_SESSION中值寫入到session_id命名的檔案中,可能已經存在, 可能需要建立新的檔案。
#
4、 銷毀SESSION
SESSION發出去的COOKIE一般屬於即時COOKIE,保存在記憶體中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才發出去的COOKIE一般屬於即時COOKIE,保存在內存中,當瀏覽器關閉後,才會過期,假如需要人為強製過期,
比如退出登錄,而不是關閉瀏覽器,那麼就需要在代碼裡銷毀SESSION,方法有很多,
1. setcookie(session_name(),session_id #(),time() #-8000000##,#..);//#退出登入前執行
# #2. usset($_SESSION);//這會刪除所有的$_SESSION數據,刷新後,有COOKIE傳過來,但沒有數據。
3. session_destroy();//這個作用更徹底,刪除$_SESSION 刪除session文件,和session_id
當不關閉瀏覽器的情況下,再刷新,2和3都會有COOKIE傳過來,但找不到資料
二、由使用者自訂session處理機制。 php.ini設定:session##.save_handler = user 使用者自訂session處理機制,更加直覺
*session_set_save_handler('open'#,'close',#'read##','write'#,'destroy ','gc');
1 .session_start(), 執行open(
$save_path,$session_name)開啟session作業句柄
$save_path 在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步
一个实际例子:
//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)
{
global$sess_save_path;
$sess_file="$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
//脚本执行结束之前,执行写入操作
function write($id,$sess_data)
{
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)
{
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<time()) {
@unlink($filename);
}
}
returntrue;
}
以上是理解PHP的SESSION機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!