自定義會(huì)話管理器

如果需要在數(shù)據(jù)庫中或者以其他方式存儲(chǔ)會(huì)話數(shù)據(jù), 需要使用 session_set_save_handler() 函數(shù)來創(chuàng)建一系列用戶級(jí)存儲(chǔ)函數(shù)。 PHP 5.4.0 之后,你可以使用 SessionHandlerInterface 類 或者通過繼承 SessionHandler 類來擴(kuò)展內(nèi)置的管理器, 從而達(dá)到自定義會(huì)話保存機(jī)制的目的。

函數(shù) session_set_save_handler() 的參數(shù)即為在會(huì)話生命周期內(nèi)要調(diào)用的一組回調(diào)函數(shù): open, readwrite 以及 close。 還有一些回調(diào)函數(shù)被用來完成垃圾清理:destroy 用來刪除會(huì)話, gc 用來進(jìn)行周期性的垃圾收集。

因此,會(huì)話保存管理器對(duì)于 PHP 而言是必需的。 默認(rèn)情況下會(huì)使用內(nèi)置的文件會(huì)話保存管理器。 可以通過 session_set_save_handler() 函數(shù)來設(shè)置自定義會(huì)話保存管理器。 一些 PHP 擴(kuò)展也提供了內(nèi)置的會(huì)話管理器,例如:sqlitememcache 以及 memcached, 可以通過配置項(xiàng) session.save_handler 來使用它們。

會(huì)話開始的時(shí)候,PHP 會(huì)調(diào)用 open 管理器,然后再調(diào)用 read 回調(diào)函數(shù)來讀取內(nèi)容,該回調(diào)函數(shù)返回已經(jīng)經(jīng)過編碼的字符串。 然后 PHP 會(huì)將這個(gè)字符串解碼,并且產(chǎn)生一個(gè)數(shù)組對(duì)象,然后保存至 $_SESSION 超級(jí)全局變量。

當(dāng) PHP 關(guān)閉的時(shí)候(或者調(diào)用了 session_write_close() 之后), PHP 會(huì)對(duì) $_SESSION 中的數(shù)據(jù)進(jìn)行編碼, 然后和會(huì)話 ID 一起傳送給 write 回調(diào)函數(shù)。 write 回調(diào)函數(shù)調(diào)用完畢之后,PHP 內(nèi)部將調(diào)用 close 回調(diào)函數(shù)。

銷毀會(huì)話時(shí),PHP 會(huì)調(diào)用 destroy 回調(diào)函數(shù)。

根據(jù)會(huì)話生命周期時(shí)間的設(shè)置,PHP 會(huì)不時(shí)地調(diào)用 gc 回調(diào)函數(shù)。 該函數(shù)會(huì)從持久化存儲(chǔ)中刪除超時(shí)的會(huì)話數(shù)據(jù)。 超時(shí)是指會(huì)話最后一次訪問時(shí)間距離當(dāng)前時(shí)間超過了 $lifetime 所指定的值。