Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent
原因:session_start() 之前已有輸出(含空白行、echo、HTML)。
解決:將 session_start() 移至程式第一行;檢查 ?> 後是否有多餘空白行。
Warning: open(F:/689phpsessiondatasess_xxx, O_RDWR) failed
解決:設定 php.ini:
session.save_path = "C:/tmp"
session.cookie_path = "C:/tmp"
並建立 C:/tmp 目錄,確保寫入權限。
Warning: Trying to destroy uninitialized session
正確寫法:
session_start();
session_destroy();
echo session_id(); // 或 echo SID; (含 name=ID 格式)
原因:某些瀏覽器/環境下,重導向前的 Session 寫入尚未完成。
解決:重導向 URL 附加 SID:
header("Location: next.php?" . SID);
session_start();
if (!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
die("請先登入");
}
session_register('data'); // PHP 4 風格,PHP 5+ 建議直接用 $_SESSION
$data = array(1,2,3,4);
$_SESSION['username'] = 'john';
echo $_SESSION['username'];
echo $HTTP_SESSION_VARS['username']; // 舊版相容
| 函式 | 行為 |
|---|---|
| session_unregister('var') | 取消單一變數註冊,需搭配 unset($_SESSION['var']) |
| session_destroy() | 銷毀整個 Session 環境,不清除 $_SESSION 陣列本身,建議搭配: |
if (isset($_COOKIE[session_name()])) {
session_start();
session_destroy();
unset($_COOKIE[session_name()]);
}
$_SESSION 而非 session_register()session_start() 放在所有輸出之前session.cookie_httponly = 1、session.use_only_cookies = 1