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

session_start() 觸發 headers already sent 錯誤的完整解決方案

     編輯:PHP 相關知識

「Cannot send session cookie - headers already sent」錯誤徹底解析

session_start() 需發送 Set-Cookie 標頭,若在此之前已有任何輸出,即會觸發此錯誤。

錯誤重現

<html>
<?php
echo "testing ...";  // ← 這裡輸出了內容
session_start();     // ← 此時標頭已送出,無法再發送 Cookie
?>
</html>

核心規則

在呼叫 session_start()、header()、setcookie() 之前,腳本絕對不能有任何輸出 (含 HTML 空白、BOM、echo、print、var_dump 等)。

修正方法

  1. 調整程式結構:將 session_start() 移至檔案最頂端,<?php 之前零輸出
  2. 啟用輸出緩衝:
    • php.ini:output_buffering = 4096 (或 On)
    • 或腳本開頭:ob_start();
  3. 檢查編碼:確保所有 PHP 檔為 UTF-8 無 BOM 格式 (Notepad++ → 編碼 → 轉為 UTF-8 無 BOM)
  4. 排除 include/require 檔案的輸出:被引入檔案同樣不可有輸出

關於 session.use_cookies = 0

嘗試關閉 Cookie 型 Session (ini_set('session.use_cookies', 0);) 並不推薦,會導致 Session ID 必須透過 URL 傳遞,安全性大幅降低,且無法解決根本的「過早輸出」問題。

最佳實踐模板

<?php
// 1. 最頂端啟用緩衝 (可選,視 php.ini 而定)
ob_start();

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

// 3. 業務邏輯...
$user = $_SESSION['user'] ?? null;

// 4. 輸出 HTML
?><!DOCTYPE html>
<html><head><title>頁面</title></head>
<body>...</body></html>

遵循此結構,徹底消除 headers already sent 錯誤。

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