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

PHP Session 啟動失敗「Cannot send session cookie - headers already sent」完整排查指南

     編輯:PHP 相關知識

錯誤訊息

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by...

核心原因

在 session_start() 呼叫前已有實際輸出(HTML、空白、echo、print、BOM、錯誤訊息等)。Session 需設定 Cookie,屬於 HTTP 標頭,必須在 Body 之前發送。

十大常見原因與解決方案

#原因解決方案
1腳本開頭有空白/換行確保 <?php 為檔案第一字元,無前置空白
2檔案編碼為 UTF-8 with BOM改為 UTF-8 無 BOM (Notepad++ / VS Code 可轉換)
3include/require 檔案尾部有空白被引入檔案省略結尾 ?>
4session_start() 前有 echo/print移至腳本最頂端,所有輸出之前
5錯誤訊息輸出 (display_errors=On)設定 display_errors=Off、log_errors=On、指定 error_log
6HTML 標籤在 session_start 前調整程式結構:PHP 邏輯在前,HTML 輸出在後
7多檔案包含鏈中某檔有輸出檢查所有 include 鏈路,使用 ob_start() 統一緩衝
8PHP 結尾 ?> 後有空行刪除結尾 ?> 或其後空白
9自動附加檔案 (auto_prepend_file)檢查 php.ini / .user.ini 設定
10輸出緩衝未啟用在腳本最開頭加 ob_start() 或 php.ini 設 output_buffering=On

快速修正模板

<?php
// 1. 最開頭啟用輸出緩衝 (解決 90% 情況)
ob_start();

// 2. 立即啟動 Session
session_start();

// 3. 後續業務邏輯...
require 'config.php';
$user = getUserFromSession();
// ...

// 4. 最後輸出 HTML
?><!DOCTYPE html>
<html>...</html>

其他 Session 常見問題彙整

session.save_path 未設定

Warning: open(/tmp/sess_xxx, O_RDWR) failed...
// php.ini 設定:
session.save_path = "C:/tmp"
session.cookie_path = "C:/tmp"
// 並建立目錄 C:\tmp 且可寫入

session_destroy() 直接呼叫報錯

Warning: Trying to destroy uninitialized session
// 必須先 session_start() 再 destroy()
session_start();
session_destroy();

取得目前 Session ID

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

Header 重導向丟失 Session

// 解決:手動附加 SID
header("Location: next.php?" . SID);
// 或啟用 session.use_trans_sid (php.ini)

Session 陣列儲存

session_register('data'); // 舊式,已棄用
$_SESSION['data'] = [1,2,3,4]; // 現代寫法:先註冊鍵名再賦值陣列

安全存取:使用超全域陣列

$_SESSION['username'] = 'user';
echo $_SESSION['username'];
// 或 $HTTP_SESSION_VARS['username'] (舊版相容)

session_unregister vs session_destroy

  • session_unregister('var'):刪除單一變數
  • session_destroy():銷毀整個 Session 環境
  • 銷毀前建議清除 Cookie:setcookie(session_name(), '', time()-3600)

作者 奇譚

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved