自訂session處理 關於read write順序問題
本帖最後由 hxx_yang 於 2015-04-10 13:00:11 編輯
header("content-type:text/html;charset=utf-8");
define('SESSION_PRE', 'XX_');
define('BR', '
');
function start ($savePath , $sessionName) {
global $sessionPath;
$sessionPath = $savePath . DIRECTORY_SEPARATOR;
echo __METHOD__ . BR;
return true;
}
function close () {
echo __METHOD__ . BR;
return true;
}
function read ($sessionId) {
global $sessionPath, $sessionFile;
$sessionFile = $sessionPath . DIRECTORY_SEPARATOR . ESSION_PRE . $sessionId;
echo __METHOD__ . BR;
return @file_get_contents($sessionFile);
}
function write ($sessionId , $data) {
global $sessionFile;
$sessionFile = $sessionPath . DIRECTORY_SEPARATOR . ESSION_PRE . $sessionId;
echo __METHOD__ . BR;
return @file_put_contents($sessionFile,$data);
}
function destroy ($sessionId) {
global $sessionFile;
@unlink($sessionFile);
echo __METHOD__ . BR;
return true;
}
function gc ($maxLifeTime) {
echo __METHOD__ . BR;
global $sessionPath;
foreach(glob($sessionPath."/*") as $file){
if (filemtime($file)+$maxLifeTime @unlink($file);
}
}
return true;
}
session_set_save_handler("start", "close", "read", "write", "destroy", "gc");
session_start(); //101行
$_SESSION['name'] = 'Lielei'; //102行
print_r($_SESSION); //103行
?>
問題描述:
按我的理解session_start()開啟後,依次啟動並執行函數是 start , read, write , close。
官方資料:PHP 會在指令碼執行完畢或調用 session_write_close() 函數之後調用write函數。
那麼,在第一次運行此指令碼到103行時,為什麼會輸出Lilei呢,此時$_SESSION中的資料是
從session檔案中讀取出來的嗎?如果是,指令碼不是還沒有結束嗎,怎麼會執行write呢?如果不是,
此時的$_SESSION只是相當於普通的數組嗎?103行不過是輸出一個普通的數組而已嘛?
------解決思路----------------------
頁面未結束,不會執行session_write_close(); 所以不會更新到session檔案,你讀取的只是內存中的session的值。