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