我間歇性地得到這個問題在我的PHP腳本(PHP 5.6,Apache 2.2的):PHP 5.6:headers_sent間歇返回true,空文件名和行0
警告:無法修改標題信息 - 頭已經在/path/to/index.php發送上線55
此警告沒有,我在這個其他問題已經看到了部分「由派」,所以我只是說這個代碼在違規之前header()
和setcookie()
來電:
if (headers_sent($filename, $linenum)){
echo("Output buffer: #" . ob_get_contents() . "#");
echo "Headers already sent in $filename on line $linenum: ";
print_r(headers_list());
}
這裏發生了問題,當我得到的輸出:
Output buffer: ##
Headers already sent in on line 0:
Array (
[0] => X-Powered-By: PHP/5.6.23
[1] => Content-type: text/html; charset=UTF-8
)
(附註:我已經output_buffering設置在php.ini 4096個字節,所以不應該在這兩個標題中的63個字符緩衝並且等待更多,而不是被過早發送?)
這個問題出現在我首次啓動一個包含Web服務器的Docker容器。之後,只有(但不是總是)在我第一次訪問我的網站(可能是一兩個小時)時發生,當我撥打header()
和setcookie()
來登錄用戶或重定向到登錄頁。
我看了又看this answer誤差一般「已經發送了頭」,並且,盡我的能力,我已經排除了這些可能的原因:
- HTML塊或來電
print
,echo
,等我之前我的PHP代碼之外調用setcookie()
或header()
- 空白
- 的BOM
auto_prepend_file
php.ini中設置gzip
流編碼 - zlib的安裝,但zlib.output_compression
是關- 重複
extension=
php.ini設置
這個答案提到
這是典型的PHP擴展或php.ini中設置,如果沒有錯誤來源具體化。
所以,我現在希望通過我的擴展... get_loaded_extensions
給了我這些條目51長度的數組:
Core, date, ereg, libxml, openssl,
pcre, zlib, filter, hash, Reflection,
SPL, session, standard, apache2handler, bz2,
calendar, ctype, curl, dom, exif,
fileinfo, ftp, gd, gettext, iconv,
mysqlnd, PDO, Phar, posix, shmop,
SimpleXML, snmp, soap, sockets, sqlite3,
sysvmsg, sysvsem, sysvshm, tokenizer, xml,
xmlwriter, xsl, mysql, mysqli, pdo_mysql,
pdo_sqlite, wddx, xmlreader, json, zip, mhash
我不使用所有這些
,所以我打算去通過並刪除未使用的,並希望其中一個導致這個問題。
最糟糕的情況下,我會嘗試碰撞我的output_buffering
值或使用ob_start()
和ob_end_flush()
來開始和結束我的文件。我不知道爲什麼這會解決它,當我目前的output_buffering
價值4096沒有,我明白,這個解決方法帶來了自己的問題。
我在這裏錯過了什麼 - 是否有其他可能的原因,我需要檢查?我應該嘗試不同的PHP版本,或者在沒有擴展名的純PHP安裝中運行我的代碼的子集?
編輯:添加了ob_get_contents()
調用和輸出,以及有關能夠通過旋轉新的Docker容器來持續複製此信息的信息。刪除了有關我的error_reporting
值的信息;更改此僅揭示了always_populate_raw_post_data
棄用通知,修復對此處描述的問題沒有影響。
請提供您設置的完整PHP文件代碼並檢查裏面的標題。我想這是一個'index.php'?如果包含,則請提供包括索引文件在內的整個包含鏈源。 –
您是否在入口點腳本的開頭調用'ob_start()'?這從你的問題不清楚,但沒有'ob_get_contents()'不會工作。另外,嘗試使用'var_dump(ob_get_contents())'。我認爲這比直接回顯值更好,因爲它會說明字符串的長度。 –
你是怎麼確定修復'always_populate_raw_post_data'這個東西不能解決問題的?這當然是一個原因。另一個說明 - 查看成功加載的擴展將無濟於事;很可能會引發相反的錯誤 - 失敗*來加載擴展。如果它表示第0行,那麼可以確定它與代碼無關,但在PHP本身初始化時會觸發某些事件。 – Narf