(PHP 4, PHP 5, PHP 7, PHP 8)
session_set_save_handler — 設置用戶(hù)自定義會(huì )話(huà)存儲函數
$open
,$close
,$read
,$write
,$destroy
,$gc
,$create_sid
= ?,$validate_sid
= ?,$update_timestamp
= ?可以使用下面的方式來(lái)注冊自定義會(huì )話(huà)存儲函數:
$sessionhandler
, bool $register_shutdown
= true
): boolsession_set_save_handler() 設置用戶(hù)自定義 會(huì )話(huà)存儲函數。 如果想使用 PHP 內置的會(huì )話(huà)存儲機制之外的方式, 可以使用本函數。 例如,可以自定義會(huì )話(huà)存儲函數來(lái)將會(huì )話(huà)數據存儲到數據庫。
本函數有 2 種原型:
sessionhandler
實(shí)現了 SessionHandlerInterface, SessionIdInterface(可選) 和/或 SessionUpdateTimestampHandlerInterface 接口的對象, 例如 SessionHandler。
register_shutdown
將函數 session_write_close() 注冊為 register_shutdown_function() 函數。
open(string $savePath, string $sessionName)
實(shí)現了以下簽名的 callable 回調:
$savePath
, string $sessionName
): bool
open 回調函數類(lèi)似于類(lèi)的構造函數,
在會(huì )話(huà)打開(kāi)的時(shí)候會(huì )被調用。
這是自動(dòng)開(kāi)始會(huì )話(huà)或者通過(guò)調用 session_start() 手動(dòng)開(kāi)始會(huì )話(huà)
之后第一個(gè)被調用的回調函數。
此回調函數操作成功返回 true
,反之返回 false
。
close
close 回調函數類(lèi)似于類(lèi)的析構函數。
在 write 回調函數調用之后調用。
當調用 session_write_close() 函數之后,也會(huì )調用 close 回調函數。
此回調函數操作成功返回 true
,反之返回 false
。
read
實(shí)現了以下簽名的 callable 回調:
$sessionId
): string如果會(huì )話(huà)中有數據,read 回調函數必須返回將會(huì )話(huà)數據編碼(序列化)后的字符串。 如果會(huì )話(huà)中沒(méi)有數據,read 回調函數返回空字符串。
在自動(dòng)開(kāi)始會(huì )話(huà)或者通過(guò)調用 session_start() 函數手動(dòng)開(kāi)始會(huì )話(huà)之后,PHP 內部調用 read 回調函數來(lái)獲取會(huì )話(huà)數據。 在調用 read 之前,PHP 會(huì )調用 open 回調函數。
read 回調返回的序列化之后的字符串格式必須與 write
回調函數保存數據時(shí)的格式完全一致。
PHP 會(huì )自動(dòng)反序列化返回的字符串并填充 $_SESSION 超級全局變量。
雖然數據看起來(lái)和 serialize() 函數很相似,
但是需要提醒的是,它們是不同的。
請參考: session.serialize_handler。
write
實(shí)現了以下簽名的 callable 回調:
$sessionId
, string $data
): bool
在會(huì )話(huà)保存數據時(shí)會(huì )調用 write
回調函數。
此回調函數接收當前會(huì )話(huà) ID 以及 $_SESSION 中數據序列化之后的字符串作為參數。
序列化會(huì )話(huà)數據的過(guò)程由 PHP 根據 session.serialize_handler 設定值來(lái)完成。
序列化后的數據將和會(huì )話(huà) ID 關(guān)聯(lián)在一起進(jìn)行保存。
當調用 read
回調函數獲取數據時(shí),所返回的數據必須要和
傳入 write
回調函數的數據完全保持一致。
PHP 會(huì )在腳本執行完畢或調用 session_write_close() 函數之后調用此回調函數。
注意,在調用完此回調函數之后,PHP 內部會(huì )調用 close
回調函數。
注意:
PHP 會(huì )在輸出流寫(xiě)入完畢并且關(guān)閉之后 才調用 write 回調函數, 所以在 write 回調函數中的調試信息不會(huì )輸出到瀏覽器中。 如果需要在 write 回調函數中使用調試輸出, 建議將調試輸出寫(xiě)入到文件。
destroy
實(shí)現了以下簽名的 callable 回調:
$sessionId
): bool
當調用 session_destroy() 函數,
或者調用 session_regenerate_id() 函數并且設置 destroy 參數為 true
時(shí),
會(huì )調用此回調函數。此回調函數操作成功返回 true
,反之返回 false
。
gc
實(shí)現了以下簽名的 callable 回調:
$lifetime
): bool
為了清理會(huì )話(huà)中的舊數據,PHP 會(huì )不時(shí)的調用垃圾收集回調函數。
調用周期由 session.gc_probability
和 session.gc_divisor 參數控制。
傳入到此回調函數的 lifetime 參數由 session.gc_maxlifetime 設置。
此回調函數操作成功返回 true
,反之返回 false
。
create_sid
實(shí)現了以下簽名的 callable 回調:
需要新的會(huì )話(huà) ID 時(shí),執行此回調函數。 它被調用時(shí)不會(huì )傳入參數,其返回值應該是一個(gè)字符串格式的、有效的 session ID。
validate_sid
實(shí)現了以下簽名的 callable 回調:
$key
): bool
開(kāi)啟 session.use_strict_mode 后,
當啟動(dòng)一個(gè) session 時(shí),提供了 session ID 后會(huì )執行此回調。
參數 key
是待驗證的 session ID。
如果該 ID 的 session 已經(jīng)存在,則為有效 session ID。
成功時(shí)返回值應當為 true
,失敗時(shí)為 false
。
update_timestamp
實(shí)現了以下簽名的 callable 回調:
$key
, string $val
): bool
更新 session 時(shí)執行此回調。
參數 key
是 session ID;參數 val
是 session 的數據。
成功時(shí)返回值應當為 true
,失敗時(shí)為 false
。
成功時(shí)返回 true
, 或者在失敗時(shí)返回 false
。
示例 #1 自定義會(huì )話(huà)管理器: 完整代碼請參見(jiàn) SessionHandlerInterface。
這里僅列出了調用方式,完整代碼請參見(jiàn) SessionHandlerInterface。
這里使用了 session_set_save_handler() 函數的 OOP 原型 并且使用第二個(gè)參數來(lái)注冊 shutdown 函數。 當將對象注冊為會(huì )話(huà)保存管理器時(shí),建議使用這種方式。
<?php
class MySessionHandler implements SessionHandlerInterface
{
// 在這里實(shí)現接口
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
// 現在可以使用 $_SESSION 保存以及獲取數據了
在對象銷(xiāo)毀之后才會(huì )調用
write
和 close
回調函數,
所以,在這兩個(gè)回調函數中不可以使用對象,也不可以?huà)伋霎惓!? 如果在函數中拋出異常,PHP 既不會(huì )捕獲它,也不會(huì )跟蹤它,
這樣會(huì )導致程序異常終止。
但是對象析構函數可以使用會(huì )話(huà)。
可以在析構函數中調用 session_write_close() 函數來(lái)解決這個(gè)問(wèn)題。 但是注冊 shutdown 回調函數才是更加可靠的做法。
如果會(huì )話(huà)在腳本結束后關(guān)閉,對于某些 SAPI 而言,當前工作目錄可能已經(jīng)被改變。 可以調用 session_write_close() 函數在腳本執行結束之前關(guān)閉會(huì )話(huà)。