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

PHP Session 進階應用:自定義儲存路徑、物件序列化、回調函數重構與自定義處理器

     編輯:PHP 相關知識

基礎配置:隔離與生命週期

<?php
// 1. 自定義 Session 檔案儲存目錄(不可被 Web 直接訪問,需可讀寫)
$savePath = __DIR__ . '/session_data/';
session_save_path($savePath);

// 2. 設定 Cookie 生命週期:1 天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);

// 3. 必須在 session_start() 之前呼叫上述兩函數
session_start();

$_SESSION['admin'] = true;
?>

儲存物件:自動序列化與反序列化

PHP 將 $_SESSION['obj'] = $object 時自動 serialize(),讀取時自動 unserialize()。但反序列化需類別定義已載入。

類別定義 (person.php)

<?php
class Person {
    public $age;
    public function setAge($age) { $this->age = $age; }
    public function output() { echo $this->age; }
}
?>

寫入 Session (setage.php)

<?php
session_start();
require_once 'person.php';
$p = new Person();
$p->setAge(21);
$_SESSION['person'] = $p;
echo "<a href='output.php'>檢視年齡</a>";
?>

讀取 Session (output.php) — 關鍵:unserialize_callback_func

<?php
// 定義回調,自動載入類別檔案
ini_set('unserialize_callback_func', 'myAutoload');
function myAutoload($className) {
    include_once $className . '.php';
}

session_start();
$person = $_SESSION['person']; // 觸發反序列化 → 呼叫 myAutoload('Person') → 載入 person.php
$person->output(); // 輸出 21
?>

自定義 Session 儲存處理器:session_set_save_handler

實現 SessionHandlerInterface 介面,將 Session 存入 Redis、MySQL、Memcached 等集中式儲存,解決多伺服器 Session 共享問題。

<?php
class RedisSessionHandler implements SessionHandlerInterface {
    private $redis;
    public function __construct($host='127.0.0.1', $port=6379) {
        $this->redis = new Redis();
        $this->redis->connect($host, $port);
    }
    public function open($savePath, $sessionName) { return true; }
    public function close() { return $this->redis->close(); }
    public function read($id) { return $this->redis->get("session:$id") ?: ''; }
    public function write($id, $data) { return $this->redis->setex("session:$id", 86400, $data); }
    public function destroy($id) { return $this->redis->del("session:$id"); }
    public function gc($maxLifetime) { return true; } // Redis 自動過期
}

// 註冊
$handler = new RedisSessionHandler();
session_set_save_handler($handler, true);
session_start();
// 後續 $_SESSION 操作自動走 Redis
?>

安全加固清單

  1. session.use_strict_mode = 1 防止未初始化 Session ID 注入。
  2. session.cookie_httponly = 1 防 XSS 竊取 Cookie。
  3. session.cookie_secure = 1 僅 HTTPS 傳輸(生產環境必開)。
  4. session.use_only_cookies = 1 禁用 URL 透傳 Session ID。
  5. 定期輪換 session_id()(如登入後 session_regenerate_id(true))。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved