Fatal error: session_start(): Failed to initialize storage module: files (path: ) in /data/www/phpmyadmin/libraries/session.inc.php on line 83
PHP 以 files 模組儲存 session,需有效的 session.save_path。錯誤 (path: ) 顯示路徑為**空值**,代表:
php.ini 中 session.save_path 被註解或設為空/tmp (屬主 root:root),導致無法寫入<?php phpinfo(); ?>
搜尋: session.save_path, session.save_handler, safe_mode
<?php
// test_session.php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$r = session_start();
var_dump($r); // bool(true) 正常;bool(false) 或 Fatal error 失敗
?>
ls -ld /tmp
# drwxrwxrwt root root ... /tmp (正常應有 sticky bit t)
ls -ld /var/lib/php/session
# 權限應為 700 或 770,擁有者 = php-fpm 使用者 (如 www-data)
# 1. 建立目錄並設定權限
mkdir -p /data/www/session
chown www-data:www-data /data/www/session
chmod 700 /data/www/session
# 2. 在專案啟動檔 (如 index.php、bootstrap.php) 最早處呼叫
session_save_path('/data/www/session');
session_start();
關鍵點:必須用 session_save_path() 函數,**不可**用 ini_set('session.save_path', ...) (對 files handler 無效)。
; /etc/php/8.1/fpm/php.ini
session.save_handler = files
session.save_path = "/var/lib/php/session"
; 重載 php-fpm
systemctl reload php-fpm
; php.ini
safe_mode = Off
; 重載服務
⚠️ PHP 5.4+ 已移除 Safe Mode,此方案僅適用舊版遺留系統。
; php.ini
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=yourpass&database=0"
; 需安裝 php-redis 擴充套件
原始碼位置:libraries/session.inc.php
<?php
// 修改前
$r = session_start();
// 修改後:在 session_start() 前指定專屬路徑
$sessionPath = '/data/www/session';
if (is_dir($sessionPath) && is_writable($sessionPath)) {
session_save_path($sessionPath);
} else {
// 兜底:嘗試建立
@mkdir($sessionPath, 0700, true);
@chown($sessionPath, 'www-data'); // 需權限
session_save_path($sessionPath);
}
$r = session_start();
if ($r !== true) {
// 錯誤處理...
}
?>
| 錯誤做法 | 正確做法 |
|---|---|
ini_set('session.save_path', '/path') | session_save_path('/path') |
共用 /tmp 且不檢查權限 | 專案獨立目錄 + 正確擁有者/權限 |
| 忽略 SELinux (CentOS/RHEL) | semanage fcontext -a -t httpd_var_run_t "/data/www/session(/.*)?" |
| session_start() 前有輸出 (含 BOM) | 確保 session_start() 在任何輸出之前 |
<?php
session_save_path('/data/www/session');
session_start();
$_SESSION['test'] = 'ok';
echo session_id(); // 輸出 session id 即成功
// 瀏覽器開發者工具 Application > Cookies > PHPSESSID 應有值
?>