由於某些原因,我必須使用默認保存處理程序初始化會話。如何'取消'會話保存處理程序?
以前的代碼顯式地使用session_set_save_handler()設置自定義處理程序。
更改以前的代碼在我的情況下不是一個現實的選擇,所以沒有人知道如何將處理程序還原爲默認值,例如是否有session_restore_save_handler或session_unset_save_handler函數或等價物?
由於某些原因,我必須使用默認保存處理程序初始化會話。如何'取消'會話保存處理程序?
以前的代碼顯式地使用session_set_save_handler()設置自定義處理程序。
更改以前的代碼在我的情況下不是一個現實的選擇,所以沒有人知道如何將處理程序還原爲默認值,例如是否有session_restore_save_handler或session_unset_save_handler函數或等價物?
由於PHP 5.4,你可以通過直接實例化SessionHandler類恢復爲默認的會話處理程序:
session_set_save_handler(new SessionHandler(), true);
這裏我來回答我自己的問題,因爲沒有人說什麼:
首先,有沒有從PHP給出session_restore_save_handler
或session_unset_save_handler
,並(通過至今)沒有本土的方式來獲得的東西回來,因爲他們是之前。出於某種原因,PHP團隊沒有給我們選擇以這種方式與會話處理程序兼容。
其次,本地會話機制可以與下面的代碼
class FileSessionHandler
{
private $savePath;
function open($savePath, $sessionName)
{
$this->savePath = $savePath;
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
register_shutdown_function('session_write_close');
這種邏輯是最接近於PHP的處理一個本地會話進行仿真,但當然,在不同的情況下不可預知的行爲。我現在可以得出的結論是,基本會話操作已經完全覆蓋。