我间歇性地得到这个问题在我的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