session_start() 需發送 Set-Cookie 標頭,若在此之前已有任何輸出,即會觸發此錯誤。
<html>
<?php
echo "testing ..."; // ← 這裡輸出了內容
session_start(); // ← 此時標頭已送出,無法再發送 Cookie
?>
</html>
在呼叫 session_start()、header()、setcookie() 之前,腳本絕對不能有任何輸出 (含 HTML 空白、BOM、echo、print、var_dump 等)。
session_start() 移至檔案最頂端,<?php 之前零輸出output_buffering = 4096 (或 On)ob_start();嘗試關閉 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 錯誤。