php中display_errors的坑

问题描述:

公司线上出现一个问题:后端的服务是nginx+php模式,php程序已经内存溢出了,但是通过nginx访问的时候,返回的还是HTTP 200 OK。

问题原因:

经过查阅资料发现,在php-fpm的运行模式下,错误信息的显示是和php的配置display_errors有关。
关于display_errors的配置有三处,分别为php-fpm.conf,php.ini以及程序里通过ini_set设置。
在php-fpm.conf里看到官方的一段解释:
php中display_errors的坑_第1张图片
大致意思是说:关于这类指令如果在php.ini和php-fpm.conf里同时设置了,则php-fpm.conf会覆盖php.ini里的,如果在程序中通过ini_set设置了,则以程序中的设置为主,也就是说优先级为: ini_set > php-fpm.conf > php.ini

手动验证:

下面手动测试一波:
测试脚本:

读取一个大于1M的文件,造成内存溢出错误。
然后通过 curl -x 127.0.0.1:80 http://test.com/php/testFatal.php -v 查看返回信息

测试一:

php-fpm.conf php.ini status
on on 200
on off 200
off on 500
off off 500

可见,是否抛出错误信息,以php-fpm.conf里的配置为主。

测试二 :
在测试脚本中加入
ini_set(‘display_errors’,true); //始终返回的是200,无论怎样修改另外两个配置文件
ini_set(‘display_errors’,false); //始终返回的是500

总结:

1 display_errors为true时,返回给nginx的是200,display_errors为false时,返回给nginx的是500,这一点不是很理解,按理说display是显示的意思,将其打开的话,应该返回给nginx是200,关闭的话,返回给nginx的是500,现在正好相反,以后再研究吧。
2 优先级: ini_set > php-fpm.conf > php.ini

你可能感兴趣的:(php)