呼叫 session_start() 時出現 Warning: session_start(): Cannot send session cache limiter - headers already sent,是 PHP 開發常見問題。本文說明原因與多種解決方式。
HTTP 協定要求 標頭必須在任何輸出內容之前發送。session_start() 需要送出 Set-Cookie 標頭,若在此之前已有輸出(包括:HTML 空白字元、echo、print、BOM 標記、錯誤訊息等),即會觸發警告並導致 Session 無法正常運作。
<html>
<?php
echo "輸出內容"; // 任何輸出
session_start(); // 錯誤:標頭已送出
?>
php.ini 設定 output_buffering = On,或程式碼開頭加 ob_start()。採用「單一進入點」架構,所有請求導向 index.php,由框架統一初始化 Session、資料庫連線等,徹底避免標頭衝突。