承接前文,提供一個最基本的檔案式 Session 儲存處理器實作 (類似內建 files 模式),可作為資料庫儲存的基礎範本。
php.ini 設定 session.save_handler = userinclude 此處理器定義檔<?php
// 開啟:初始化全域路徑變數
function sess_open($save_path, $session_name) {
global $sess_save_path, $sess_session_name;
$sess_save_path = $save_path;
$sess_session_name = $session_name;
return true;
}
// 關閉:無特殊處理
function sess_close() {
return true;
}
// 讀取:依 session_id 讀取對應檔案內容
function sess_read($id) {
global $sess_save_path, $sess_session_name;
$file = "$sess_save_path/sess_$id";
if ($fp = @fopen($file, 'r')) {
$data = fread($fp, filesize($file));
fclose($fp);
return $data;
}
return '';
}
// 寫入:將序列化資料寫入檔案
function sess_write($id, $data) {
global $sess_save_path, $sess_session_name;
$file = "$sess_save_path/sess_$id";
if ($fp = @fopen($file, 'w')) {
$result = fwrite($fp, $data);
fclose($fp);
return $result;
}
return false;
}
// 銷毀:刪除對應檔案
function sess_destroy($id) {
global $sess_save_path, $sess_session_name;
$file = "$sess_save_path/sess_$id";
return @unlink($file);
}
// 垃圾回收:掃描並刪除過期檔案 (maxlifetime 秒)
function sess_gc($maxlifetime) {
global $sess_save_path;
$dir = opendir($sess_save_path);
while (($file = readdir($dir)) !== false) {
if (substr($file, 0, 5) === 'sess_') {
$path = "$sess_save_path/$file";
if (filemtime($path) + $maxlifetime < time()) {
@unlink($path);
}
}
}
closedir($dir);
return true;
}
// 註冊處理器
session_set_save_handler(
'sess_open', 'sess_close',
'sess_read', 'sess_write',
'sess_destroy', 'sess_gc'
);
// 啟動 session (放在所有腳本開頭)
session_start();
?>
將 sess_read/write/destroy/gc 中的檔案操作改為 SQL 查詢 (建立 sessions 表:id, data, expiry),即可實現分散式 Session 共享。