<?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()。但反序列化需類別定義已載入。
<?php
class Person {
public $age;
public function setAge($age) { $this->age = $age; }
public function output() { echo $this->age; }
}
?>
<?php session_start(); require_once 'person.php'; $p = new Person(); $p->setAge(21); $_SESSION['person'] = $p; echo "<a href='output.php'>檢視年齡</a>"; ?>
<?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
?>
實現 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
?>
session.use_strict_mode = 1 防止未初始化 Session ID 注入。session.cookie_httponly = 1 防 XSS 竊取 Cookie。session.cookie_secure = 1 僅 HTTPS 傳輸(生產環境必開)。session.use_only_cookies = 1 禁用 URL 透傳 Session ID。session_id()(如登入後 session_regenerate_id(true))。