投票功能需限制同一用戶對同圖片僅投一次,採用 Session 記錄投票狀態,Session ID 需存本地 Cookie。按手冊操作 Session 正常,但 setcookie() 後瀏覽器無 Cookie 文件。單獨測試 setcookie() 卻正常,排除瀏覽器設置問題。
ThinkPHP 框架執行流程中,可能在 setcookie() 前已有輸出(如空白字符、BOM 頭、錯誤信息),導致 HTTP 頭已發送,Cookie 設置失效。本地環境 php.ini 默認開啟 output_buffering,服務器可能關閉,因此本地正常、服務器失效。
output_buffering = On
修改後重啟 Apache。
在入口文件 index.php 最頂部(<?php 後)添加:
ob_start();
同根同源,典型原因:
setcookie() 前有 echo、print、HTML 空白輸出錯誤提示 output started at /path/file.php:行號,打開該文件檢查指定行前是否有輸出。常見:文件第一行是空白行、UTF-8 BOM、關閉標簽 ?> 後有換行。
?>ob_start() 或配置 output_buffering = OnCookie/Session 衝突本質是「輸出緩衝未開啟導致 Header 過早發送」。服務器環境與本地差異是常見誘因,統一開啟 output_buffering 徹底解決。