1. 程式人生 > >PHP session

PHP session

生命周期 二進制 會話 生成 順序 emca 默認 資源 保險

/* 【session】 */
1. 開啟session機制
session_start()
註意:session_start()函數前不能有輸出!除非開啟ob緩存。
2. 操作數據
對$_SESSION數組進行操作
3. 瀏覽器端保存SessionID,默認為當前域名下的所有目錄及其子目錄生效。即默認設置cookie的path值為‘/‘
4. 服務器保存session數據
默認保存方式:每個會話都會生成一個session數據文件,文件名為:sess_加SessionID
5. session可以存儲除了資源以外的任何類型數據。
數據被序列化後再保存到文件中。
6. $_SESSION的元素下標不能為整型!
因為只對元素值進行序列化。
元素內的數組下標無此要求。
7. 生存周期
默認是瀏覽器關閉
因為瀏覽器保存的cookie變量SessionID是臨時的
但是服務器端的session數據文件不一定消失(需要等待session的垃圾回收機制來處理)
可以延長cookie中PHPSESSID變量的生命周期。(不推薦)
php.ini配置session.gc_maxlifetime
8. 刪除數據
$_SESSION變量在腳本結束時依然會消失。開啟session機制時會造出$_SESSION變量。
$_SESSION與保存session數據的文件是兩個空間。
unset($_SESSION[‘key‘])只是刪除數組內的該元素,不會立即相應到保存session數據的文件上。
等到腳本結束,才會將$_SESSION的數據寫入到該文件中。
session_destroy() 銷毀保存session數據的文件,也不會對該文件寫入內容。
並不刪除$_SESSION變量,unset或腳本結束才會刪除該變量。
如何完全刪除一個session?需刪除3部分
unset($_SESSION);
刪除$_SESSION變量後,數據文件並未被改動。如果單獨使用unset,則需先置空$_SESSION = array()
session_destroy();
setcookie(‘PHPSESSID‘, ‘‘, time()-1); //保險做法是將其生命周期失效
整個腳本周期內,只對數據文件讀一次、寫一次。

// 重寫session的存儲機制
# session存儲方式
session.save_handler = user|files|memcache
# 因數據文件過多導致的問題,可通過分子目錄保存進行解決
PHP配置文件下session.save_path選項,並需手動創建數據存放目錄。
在該配置選項前加層級。分布子目錄的原則,利用會話ID的相應字母來分配子目錄。仍需手動創建子目錄。
session.save_path = "2; F:/PHPJob/Temp"
# 多服務器數據共享問題
# 數據存儲操作:
初始化$open、釋放資源$close、讀$read、寫$write、銷毀存儲介質$destroy(調用session_destroy時觸發該操作)、垃圾回收$gc
# 會話ID的長度可變。不同的設置方式導致不同長度的會話ID。
session.hash_function 允許用戶指定生成會話ID的散列算法。
‘0‘ 表示MD5(128 位),‘1‘ 表示SHA-1(160 位)。
session.hash_bits_per_character 允許用戶定義將二進制散列數據轉換為可讀的格式時每個字符存放多少個比特。
可能值為 ‘4‘(0-9,a-f),‘5‘(0-9,a-v),以及 ‘6‘(0-9,a-z,A-Z,"-",",")。
總hash長度為128bit,會話ID長度為128/可能值,4->32, 5->26, 6->22
# 自定義數據存儲操作方法
# 註意:不用關心PHP如何序列化、反序列化、如何得到數據和寫入數據,只做與數據存儲相關的操作
session_set_save_handler 設置用戶自定義的會話數據存儲函數
bool session_set_save_handler(callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc)
執行順序:open, close, r

PHP session