如果需要在數據庫中或者以其他方式存儲會(huì )話(huà)數據, 需要使用 session_set_save_handler() 函數來(lái)創(chuàng )建一系列用戶(hù)級存儲函數。 PHP 5.4.0 之后,你可以使用 SessionHandlerInterface 類(lèi) 或者通過(guò)繼承 SessionHandler 類(lèi)來(lái)擴展內置的管理器, 從而達到自定義會(huì )話(huà)保存機制的目的。
函數 session_set_save_handler() 的參數即為在會(huì )話(huà)生命周期內要調用的一組回調函數:
open
, read
,
write
以及 close
。
還有一些回調函數被用來(lái)完成垃圾清理:destroy
用來(lái)刪除會(huì )話(huà),
gc
用來(lái)進(jìn)行周期性的垃圾收集。
因此,會(huì )話(huà)保存管理器對于 PHP 而言是必需的。
默認情況下會(huì )使用內置的文件會(huì )話(huà)保存管理器。
可以通過(guò) session_set_save_handler() 函數來(lái)設置自定義會(huì )話(huà)保存管理器。
一些 PHP 擴展也提供了內置的會(huì )話(huà)管理器,例如:sqlite
,
memcache
以及 memcached
,
可以通過(guò)配置項 session.save_handler 來(lái)使用它們。
會(huì )話(huà)開(kāi)始的時(shí)候,PHP 會(huì )調用 open
管理器,然后再調用
read
回調函數來(lái)讀取內容,該回調函數返回已經(jīng)經(jīng)過(guò)編碼的字符串。
然后 PHP 會(huì )將這個(gè)字符串解碼,并且產(chǎn)生一個(gè)數組對象,然后保存至 $_SESSION
超級全局變量。
當 PHP 關(guān)閉的時(shí)候(或者調用了 session_write_close() 之后),
PHP 會(huì )對 $_SESSION 中的數據進(jìn)行編碼,
然后和會(huì )話(huà) ID 一起傳送給 write
回調函數。
write
回調函數調用完畢之后,PHP 內部將調用
close
回調函數。
銷(xiāo)毀會(huì )話(huà)時(shí),PHP 會(huì )調用 destroy
回調函數。
根據會(huì )話(huà)生命周期時(shí)間的設置,PHP 會(huì )不時(shí)地調用 gc
回調函數。
該函數會(huì )從持久化存儲中刪除超時(shí)的會(huì )話(huà)數據。
超時(shí)是指會(huì )話(huà)最后一次訪(fǎng)問(wèn)時(shí)間距離當前時(shí)間超過(guò)了 $lifetime
所指定的值。