Warning: session_start(): open(/var/lib/php/session/sess_xxx, O_RDWR) failed: Permission denied (13)
Warning: Unknown: open(/var/lib/php/session/sess_xxx, O_RDWR) failed: Permission denied (13)
Warning: Unknown: Failed to write session data (files); Please verify that the current setting of session.save_path is correct
session_start() 失敗通常源於三大類問題:
session.save_path 指向的目錄缺失、權限錯誤、或屬主不符/tmp 以外目錄session_start() 前有 echo、空白字元、BOM 標記等輸出; php.ini
session.save_path = "C:\php\session_temp"
; 建立資料夾並給予 IIS_IUSRS 修改權限
; icacls "C:\php\session_temp" /grant "IIS_IUSRS:(OI)(CI)M"
# 1. 建立專屬 session 目錄 (避免使用 /tmp)
mkdir -p /var/lib/php/session
chown www-data:www-data /var/lib/php/session # 依實際 PHP-FPM 使用者調整
chmod 700 /var/lib/php/session
# 2. 修改 php.ini
session.save_path = "/var/lib/php/session"
session.save_handler = files
# 3. 重載 PHP-FPM
systemctl reload php-fpm
# 檢查 SELinux 狀態
getenforce
# 允許 httpd 讀寫 session 目錄
semanage fcontext -a -t httpd_var_run_t "/var/lib/php/session(/.*)?"
restorecon -Rv /var/lib/php/session
# 或暫時設為 Permissive (不建議生產環境)
setenforce 0
<?php
// 必須在 session_start() 之前呼叫
$savePath = '/data/www/session'; // 專案專屬目錄
if (is_dir($savePath) && is_writable($savePath)) {
session_save_path($savePath);
} else {
// 目錄不存在嘗試建立
if (mkdir($savePath, 0700, true)) {
chown($savePath, 'www-data'); // 需 root 權限或預先建立
session_save_path($savePath);
} else {
// 降級處理:使用系統預設但記錄錯誤
error_log("Session save path not writable: $savePath");
}
}
session_start();
?>
檢查 session.save_path 與 session.save_handler 實際值tail -f /var/log/php-fpm/error.log 或 Apache error_logls -ld /var/lib/php/session 確認擁有者與模式<?php
session_start();
var_dump(session_id());
$_SESSION['test'] = time();
echo "OK";
?>
| 誤區 | 正確觀念 |
|---|---|
ini_set('session.save_path', ...) 有效 | 僅在 session_start() **之前** 呼叫 session_save_path() 才生效;ini_set 對 session 模組無效 |
設 session.auto_start = 1 就能解決 | 這只是自動啟動 session,若路徑權限錯誤依然會失敗 |
用 /tmp 就沒事 | 共用 /tmp 有安全風險(其他使用者可讀寫),且 systemd 私有 tmp 可能導致看不到檔案 |
session.save_path (如 /data/projectA/session)700session.save_handler = redis