PHP的$_SESSION變量

        通過爲每個獨立用戶分配唯一的會話 ID,可以實現針對不同用戶分別存儲數據的功能。 會話通常被用來在多個頁面請求之間保存及共享信息。 一般來說,服務器將會話 ID 通過 set_cookie報文頭 的方式發送到瀏覽器,並且在服務器端也是通過會話 ID 來取回會話中的數據。 如果請求中不包含會話 ID 信息(cookie頭信息),那麼 PHP 就會創建一個新的會話,併爲新創建的會話分配新的 ID。

        會話的工作流程很簡單。當開始一個會話時,PHP 會嘗試從請求中查找會話 ID (通常通過會話 cookie), 會話開始之後,PHP 就會將會話中session文件內的數據設置到 $_SESSION變量中來保存。如果請求中不包含會話 ID 信息,PHP 就會創建一個新的會話,次吃也會設置一個$_SESSION數組,但因爲沒有session文件,它是空的。  當 PHP 停止的時候,它會自動讀取 $_SESSION 中的內容,並將其進行序列化, 然後發送給會話保存管理器器來進行保存。
千萬不要使用 unset($_SESSION) 來複位超級變量 $_SESSION, 因爲這樣會導致無法繼續在$_SESSION 中註冊會話變量。

Note:

        無論是通過調用函數 session_start() 手動開啓會話, 還是使用配置項 session.auto_start 自動開啓會話, 對於基於文件的會話數據保存(PHP 的默認行爲)而言, 在會話開始的時候都會給會話數據文件加鎖, 直到 PHP 腳本執行完畢或者顯式調用 session_write_close() 來保存會話數據。 在此期間,其他腳本不可以訪問同一個會話數據文件。

        對於大量使用 Ajax 或者併發請求的網站而言,這可能是一個嚴重的問題。 解決這個問題最簡單的做法是如果修改了會話中的變量, 那麼應該儘快調用 session_write_close() 來保存會話數據並釋放文件鎖。 還有一種選擇就是使用支持併發操作的會話保存管理器來替代文件會話保存管理器。

        session_unset();釋放當前在內存中已經創建的所有$_SESSION變量,但不刪除session文件以及不釋放對應的session id
        session_destroy() ;刪除當前用戶對應的session文件以及釋放session id,內存中的$_SESSION變量內容依然保留。


        爲了徹底銷燬會話,比如在用戶退出登錄的時候,必須同時重置會話 ID。 如果是通過 cookie 方式傳送會話 ID 的,那麼同時也需要 調用setcookie() 函數來 刪除客戶端的會話 cookie。


<?php
// 初始化會話。// 如果要使用會話,別忘了現在就調用:
session_start();
// 重置會話中的所有變量
$_SESSION = array();
// 如果要清理的更徹底,那麼同時刪除會話 cookie
// 注意:這樣不但銷燬了會話中的數據,還同時銷燬了會話本身
if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"] );}
// 最後,銷燬會話session_destroy();
?> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章