首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP Session 常見問題與解決方案大全

     編輯:PHP 相關知識

1. Headers Already Sent 錯誤

Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent

原因:session_start() 之前已有輸出(含空白行、echo、HTML)。
解決:將 session_start() 移至程式第一行;檢查 ?> 後是否有多餘空白行。

2. Session 儲存路徑錯誤

Warning: open(F:/689phpsessiondatasess_xxx, O_RDWR) failed

解決:設定 php.ini:

session.save_path = "C:/tmp"
session.cookie_path = "C:/tmp"

並建立 C:/tmp 目錄,確保寫入權限。

3. session_destroy() 需先啟動 Session

Warning: Trying to destroy uninitialized session

正確寫法:

session_start();
session_destroy();

4. 取得目前 Session ID

echo session_id(); // 或 echo SID; (含 name=ID 格式)

5. Header 重導向後 Session 變數遺失

原因:某些瀏覽器/環境下,重導向前的 Session 寫入尚未完成。
解決:重導向 URL 附加 SID:

header("Location: next.php?" . SID);

6. 頁面存取控制範例

session_start();
if (!isset($_SESSION['login']) || $_SESSION['login'] !== true) {
    die("請先登入");
}

7. Session 註冊變數順序:先註冊再賦值

session_register('data'); // PHP 4 風格,PHP 5+ 建議直接用 $_SESSION
$data = array(1,2,3,4);

8. 透過超全域陣列存取 Session

$_SESSION['username'] = 'john';
echo $_SESSION['username'];
echo $HTTP_SESSION_VARS['username']; // 舊版相容

9. session_unregister() vs session_destroy()

函式行為
session_unregister('var')取消單一變數註冊,需搭配 unset($_SESSION['var'])
session_destroy()銷毀整個 Session 環境,不清除 $_SESSION 陣列本身,建議搭配:
if (isset($_COOKIE[session_name()])) {
    session_start();
    session_destroy();
    unset($_COOKIE[session_name()]);
}

最佳實踐總結 (PHP 5.4+)

  • 使用 $_SESSION 而非 session_register()
  • session_start() 放在所有輸出之前
  • 設定 session.cookie_httponly = 1、session.use_only_cookies = 1
  • 定期清理過期 Session 檔案
  • 重要操作前重新驗證 Session 有效性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved