無法在發生錯誤時創建會話,請檢查 PHP 或網站服務器日志,並正確配置 PHP 安裝
核心原因:Session 儲存路徑不存在、不可寫、或權限錯誤,導致 PHP 無法寫入 session 檔案。
php.ini,尋找 session.save_path。C:\Windows\Temp、C:\php\tmp)。Modify 或 Write)。C:\php\sessions,設定權限,並在 php.ini 指定:session.save_path = "C:\php\sessions"。# 1. 確認 session.save_path
php -i | grep session.save_path
# 輸出範例:/var/lib/php/sessions
# 2. 檢查目錄權限
ls -ld /var/lib/php/sessions
# 正常應為:drwx-wx-wt 2 root root 4096 ... /var/lib/php/sessions
# 權限位:sticky bit (t) + others wx
# 3. 修正擁有者與權限(以 Apache/www-data 為例)
chown -R root:www-data /var/lib/php/sessions
chmod 1777 /var/lib/php/sessions # 1=sticky bit, 777=所有者/群組/其他 可讀寫執行
# 4. 若仍失敗,臨時測試 777(生產環境慎用)
chmod -R 777 /var/lib/php/sessions
<?php
// php.ini 或執行時設定
session.save_path = "/var/www/myapp/sessions"
# 建立目錄並設定權限
mkdir -p /var/www/myapp/sessions
chown -R www-data:www-data /var/www/myapp/sessions
chmod 770 /var/www/myapp/sessions
# 檢查 SELinux 狀態
getenforce
# 若為 Enforcing,需設定正確 context
semanage fcontext -a -t httpd_var_run_t "/var/www/myapp/sessions(/.*)?"
restorecon -Rv /var/www/myapp/sessions
# 或暫時關閉 SELinux(不推薦)
setenforce 0
df -h /var/lib/php/sessions # 檢查磁碟空間
df -i /var/lib/php/sessions # 檢查 Inode 使用率
# 若 Inode 100%,需清理舊 session 檔案
find /var/lib/php/sessions -type f -mtime +1 -delete
<?php
// php.ini 或程式碼中
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=yourpassword&database=0"
# 或 Memcached
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
# 安裝擴展
# pecl install redis
# pecl install memcached
優勢:解決多伺服器 Session 共享、避免檔案系統權限問題、效能更高、支援叢集。
php -i | grep session.save_path 確認路徑。ls -ld 路徑 確認目錄存在、權限、擁有者。ps aux | grep php-fpm 確認執行用戶/群組。sudo -u www-data touch /path/test && rm /path/test 以執行用戶測試寫入。error_log 是否有 session_start(): open(...) failed: Permission denied。session_save_path('/tmp') 測試是否為路徑問題。open_basedir 是否限制了 session 路徑。Session 無法建立 90% 為 session.save_path 目錄權限問題。Windows 檢查用戶寫入權限,Linux 檢查擁有者/群組/Sticky bit/SELinux。生產環境強烈建議改用 Redis/Memcached 統一儲存,徹底規避檔案系統權限與多節點同步難題。