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 可轉換) |
| 3 | include/require 檔案尾部有空白 | 被引入檔案省略結尾 ?> |
| 4 | session_start() 前有 echo/print | 移至腳本最頂端,所有輸出之前 |
| 5 | 錯誤訊息輸出 (display_errors=On) | 設定 display_errors=Off、log_errors=On、指定 error_log |
| 6 | HTML 標籤在 session_start 前 | 調整程式結構:PHP 邏輯在前,HTML 輸出在後 |
| 7 | 多檔案包含鏈中某檔有輸出 | 檢查所有 include 鏈路,使用 ob_start() 統一緩衝 |
| 8 | PHP 結尾 ?> 後有空行 | 刪除結尾 ?> 或其後空白 |
| 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>
Warning: open(/tmp/sess_xxx, O_RDWR) failed...
// php.ini 設定:
session.save_path = "C:/tmp"
session.cookie_path = "C:/tmp"
// 並建立目錄 C:\tmp 且可寫入
Warning: Trying to destroy uninitialized session
// 必須先 session_start() 再 destroy()
session_start();
session_destroy();
echo session_id(); // 或 echo SID; (包含 name=id 格式)
// 解決:手動附加 SID
header("Location: next.php?" . SID);
// 或啟用 session.use_trans_sid (php.ini)
session_register('data'); // 舊式,已棄用
$_SESSION['data'] = [1,2,3,4]; // 現代寫法:先註冊鍵名再賦值陣列
$_SESSION['username'] = 'user';
echo $_SESSION['username'];
// 或 $HTTP_SESSION_VARS['username'] (舊版相容)
session_unregister('var'):刪除單一變數session_destroy():銷毀整個 Session 環境setcookie(session_name(), '', time()-3600)作者 奇譚