PHP 7.2.1中count(null)触发警告致输出中断的技术咨询
为什么PHP警告会导致"Hello World"无法输出(IIS 8 + Windows Server 2012 R2)
你说得完全对——PHP警告本身绝对不会中断脚本执行,按道理echo "Hello World";肯定会正常输出。之所以没看到,大概率是你的IIS和PHP的环境配置在搞鬼,我整理了几个最常见的原因和解决办法:
1. IIS FastCGI的「快速失败保护」杀了PHP进程
在IIS的FastCGI配置里,有个默认开启的「快速失败保护」机制:如果短时间内PHP进程触发了多个错误(比如你的脚本里连续炸了2条count(null)的警告),IIS会直接终止这个PHP进程,导致后续的输出还没来得及发送就被掐断了。
怎么排查修改:
- 打开IIS管理器,找到你的站点对应的FastCGI应用程序(一般是
php-cgi.exe那项) - 右键选「编辑」,找到「快速失败保护」的设置:
- 先把「快速失败保护启用」暂时改成
False,或者把「失败次数阈值」调得高一点(比如从默认的5改成10)
- 先把「快速失败保护启用」暂时改成
- 重启IIS再跑脚本试试,要是"Hello World"出来了,就说明是这个问题
2. PHP错误输出和正常输出的缓冲区打架了
如果PHP的display_errors是开着的,警告信息会直接怼到响应流里。而在IIS的FastCGI环境下,错误输出有时候会抢占输出缓冲区,把后面的正常输出给覆盖或者吞掉——尤其是当错误信息先输出,而输出缓冲没开启的时候。
验证方法很简单:
- 在脚本最开头加一行
ini_set('display_errors', 0);,关掉错误显示,再运行脚本 - 要是"Hello World"出来了,就说明是缓冲区的锅。你可以修改
php.ini里的output_buffering,比如设成output_buffering = 4096开启缓冲,让正常内容先存起来,最后一起输出,避免和错误信息抢流
3. IIS的自定义错误页把正常输出覆盖了
如果你的IIS配置了自定义错误页面,当PHP输出警告时,IIS可能会把整个响应替换成自定义错误页,直接把"Hello World"给覆盖掉了。
检查方式:
- 打开IIS管理器,进入站点的「错误页」设置
- 看看有没有针对非标准HTTP状态码(PHP警告对应的状态码可能不是4xx/5xx,但IIS可能会拦截)的自定义页
- 暂时把错误页改成「详细错误」模式,再跑脚本,要是能同时看到警告和"Hello World",就说明是这个问题
快速验证步骤
- 先在脚本开头加
ini_set('display_errors', 0);,关掉错误显示,看内容是否出现——出现就是输出冲突问题 - 要是步骤1没用,去关IIS的FastCGI快速失败保护,再测
- 最后检查IIS的错误页配置
内容的提问来源于stack exchange,提问作者Andrew Berridge
相关产品推荐
相关产品推荐

