Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
原因:`session_start()` 前有輸出 (含空白、BOM、echo、HTML)
解決:
Warning: open(/tmp/sess_xxx, O_RDWR) failed: No such file or directory
解決:
; php.ini
session.save_path = "/var/lib/php/sessions" ; 確保目錄存在且可寫
; 或代碼中設置 (需在 session_start 前)
ini_set('session.save_path', '/custom/path/sessions');
session_save_path('/custom/path/sessions'); // 專用函數
創建目錄並設置權限:`mkdir -p /var/lib/php/sessions && chmod 700 /var/lib/php/sessions && chown www-data:www-data /var/lib/php/sessions`
Warning: Trying to destroy uninitialized session
原因:直接調用 `session_destroy()` 未先 `session_start()`
解決:
<?php
session_start(); // 必須先啟動
session_destroy(); // 再銷毀
?>
<?php
session_start();
echo session_id(); // 推薦
echo SID; // 常量,格式:PHPSESSID=abc123
?>
場景:`header('Location: ...')` 跳轉後 `$_SESSION` 讀不到
原因:Session ID 未傳遞到新頁面 (Cookie 未設置/未攜帶)
解決:
<?php
session_start();
$_SESSION['user'] = 'admin';
// 跳轉前確保 Session 寫入
session_write_close(); // 關鍵!釋放鎖並寫入存儲
header('Location: next.php?' . SID); // 附帶 SID 參數 (備用)
exit;
?>
<?php
// PHP 5.4+ 已移除,不要使用
session_register('var'); // ❌
session_unregister('var'); // ❌
session_is_registered('var'); // ❌
// 現代寫法
$_SESSION['var'] = $value; // ✅
unset($_SESSION['var']); // ✅
isset($_SESSION['var']); // ✅
?>
<?php
// 錯誤:先賦值後註冊 (舊版邏輯)
session_register('data');
$data = [1,2,3]; // 可能不生效
// 正確:現代 PHP 直接賦值
$_SESSION['data'] = [1,2,3]; // ✅ 即時生效
?>
<?php
// 歷史兼容 (不推薦)
$HTTP_SESSION_VARS['user'] // PHP 5.4+ 移除
// 現代標準
$_SESSION['user'] // ✅
$GLOBALS['_SESSION']['user'] // 同一引用
?>
| 函數 | 作用 | 適用場景 |
|---|---|---|
| unset($_SESSION['key']) | 刪除單個變量 | 登出特定功能、清理緩存 |
| session_destroy() | 銷毀整個 Session 數據文件 | 用戶登出、權限變更 |
<?php
// 完整登出流程
session_start();
$_SESSION = []; // 清空數組
if (ini_get('session.use_cookies')) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params['path'], $params['domain'],
$params['secure'], $params['httponly']
);
}
session_destroy(); // 刪除服務器存儲文件
?>
解決:修改 `session.save_handler` 使用共享存儲
; php.ini 或代碼中
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379?auth=password&database=0');
// 需安裝 phpredis 擴展
; 或 Memcached
ini_set('session.save_handler', 'memcached');
ini_set('session.save_path', '127.0.0.1:11211');
// 或 Database (需自定義處理器)
?>