PHP警告没有显示它应该什么时候

时间:2014-11-19 15:18:25

标签: php

更新

在php.ini中将output_buffering设置为0可以解决此问题。但有没有办法在不依赖这个指令的情况下做到这一点?根据{{​​3}}这个指令有模式PHP_INI_PERDIR,这意味着它不能用ini_set()设置,并且必须在php.ini,.htaccess,httpd.conf或.user.ini中设置。

原始问题

我知道如何解决“无法修改标头信息”的PHP警告,但我似乎无法得到此警告,即使我在输出后尝试修改标头时也是如此。例如:

error_reporting(E_ALL);
ini_set('display_errors', 1);
echo ini_get('error_reporting');
header('location:./');

不会产生错误,只会重新定向,就像没有发生任何事情一样。在我的测试环境中不会发生这种情况(我会按预期得到错误)。这些是我对开发与测试的设置:

开发

PHP v5.5.15
error_reporting = E_ALL
display_errors = On

测试

PHP v5.3.27
error_reporting = E_ALL
display_errors = On

我怀疑可能有另一个PHP设置但我无法找到它。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

PHP指令output_buffering必须设置为0才能在发送重定向标头之前查看输出。这只能通过以下方式实现:

在php.ini或.user.ini中设置指令

output_buffering = 0

或者使用Apache并修改.htaccess或httpd.conf

php_flag "output_buffering" Off

启用output_buffering后,任何回声或PHP通知和警告都将存储在变量中,并且在脚本运行完毕之前不会输出。设置位置标题不会生成PHP警告,因为因为输出缓冲,一旦有输出就不会发送标题。脚本到达结尾,包含位置标题的整个输出blob立即发送,允许页面正常重定向。

我希望能够看到之前未检测到的PHP警告和通知,因为输出一直保存到结束,重定向隐藏了错误。为您的开发环境关闭output_buffering可能是一个好主意,这样您就不会意识到这些错误。对于生产,output_buffering可能会有性能改进,而且应该关闭error_reporting,这样你就不会遗漏任何东西。

注意:您也可以在致电flush()之前拨打ob_end_flush()header(),这样就会产生所需的警告。