錯誤現象
Warning: Failed to write session data (files).
Please verify that the current setting of session.save_path is correct () in Unknown on line 0
核心原因
session.save_path 未設置或指向不可寫目錄
- 目錄權限不足(Web 用戶無寫入權限)
- 多站點共享同一 session 目錄導致 GC 衝突
方案一:設置有效保存路徑(推薦)
; php.ini
session.save_path = "D:/phprun/tmp"
; 或 Linux
session.save_path = "/var/lib/php/sessions"
; 確保目錄存在且可寫
mkdir -p /var/lib/php/sessions
chown www-data:www-data /var/lib/php/sessions
chmod 700 /var/lib/php/sessions
方案二:代碼動態設置
<?php
ini_set('session.save_path', '/path/to/writable/dir');
session_start();
Session GC 機制深度解析
- 觸發概率:
gc_probability / gc_divisor = 1/100(默認 1% 請求觸發)
- 過期判斷:當前時間 - 最後修改時間 >
gc_maxlifetime (默認 1440 秒 = 24 分鐘)
- 多站點風險:GC 掃描不區分站點,可能誤刪他站有效 Session
多站點隔離最佳實踐
; 站點獨立 session 目錄
; 站點 A
session.save_path = "/var/lib/php/sessions/site_a"
; 站點 B
session.save_path = "/var/lib/php/sessions/site_b"
; 或使用 session_name 隔離
session_name('SITE_A_SESS');
session_start();
驗證腳本
<?php
session_start();
$_SESSION['test'] = time();
echo "Session ID: " . session_id() . "<br>";
echo "Save Path: " . ini_get('session.save_path') . "<br>";
echo "GC Max Lifetime: " . ini_get('session.gc_maxlifetime') . "<br>";
echo "Test Value: " . $_SESSION['test'] . "<br>";
避坑清單
- Windows 路徑使用正斜杠或雙反斜杠
- 共享主機無法改 php.ini 時用
ini_set()
- 定期清理過期 session 文件防止 inode 耗盡
- 高併發考慮 Redis/Memcached 存儲