首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 進階函數補充 (三):自訂儲存處理器完整實作範例

     編輯:PHP 相關知識

前言

承接前文,提供一個最基本的檔案式 Session 儲存處理器實作 (類似內建 files 模式),可作為資料庫儲存的基礎範本。

配置前置條件

  1. php.ini 設定 session.save_handler = user
  2. 每支使用 Session 的腳本皆需 include 此處理器定義檔

完整實作程式碼

<?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 共享。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved