设置错误报告级别

  注意:在/program/php/etc/php-fpm.conf文件里有一个控制错误报告的总开关,无论是修改php.ini文件还是在具体PHP脚本设置错误报告级别,都必须基于这个开关,否则怎么设置都没用。

; 控制错误报告的总开关(可选值:on|off),强烈建议将该参数删除或注释,统一通过php.ini来控制错误报告
php_flag[display_errors] = on

  修改/program/php/php.ini文件(对所有PHP脚本有效)
 
; 关闭所有错误报告(适用于生产环境)
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off

; 报告所有错误(适用于开发环境)
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
 
  在具体PHP脚本设置(仅对该PHP脚本有效)
 
<?php
// 关闭所有错误报告(适用于生产环境)
ini_set('display_errors', 'Off'); // 将display_errors设置为Off
error_reporting(0);               // 关闭所有错误报告

// 报告所有错误(适用于开发环境)
ini_set('display_errors', 'On'); // 将display_errors设置为On
error_reporting(-1);             // 报告所有错误

// 报告部分错误(适用于开发环境)
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED); // 报告除NOTICE、STRICT、DEPRECATED之外的错误
 
  一般来说,在开发环境下应该报告所有错误,以便开发时尽可能把潜在错误解决掉,在生产环境下则应该关闭所有错误报告,避免程序出错时错误报告暴露服务器敏感信息。

  生产环境最佳的错误报告配置
 
  首先要明确一点,生产环境永远要关闭所有错误报告,避免程序出错时错误报告暴露服务器敏感信息,所以display_errors要设为Off是毫无疑问的。我们不可能保证生产环境的程序代码不出错,一旦出错了就必须把错误信息记录下来,这时log_errors和error_log就可以帮助我们实现PHP脚本执行出错时不报告错误但是把错误信息记录到指定文件,核心配置项看下面的代码(注意需要修改两个配置文件):

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; 提醒:以下配置属于/program/php/etc/php-fpm.conf文件 ;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 指定PHP-FPM运行错误日志记录文件(注意不是PHP脚本运行错误)
error_log = /program/php/log/php-fpm.error.log

; 记录什么级别的PHP-FPM运行错误
; 可选值:alert(必须立即处理)、error(错误情况)、warning(警告情况)、notice(一般重要信息)、debug(调试信息),缺省值为notice。
log_level = warning

; 该项必须开启且设为yes才能记录PHP脚本运行错误
catch_workers_output = yes

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;; 提醒:以下配置属于/program/php/php.ini文件 ;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; 报告除DEPRECATED、STRICT之外的错误
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

; 关闭错误报告
display_errors = Off

; 关闭启动错误报告
display_startup_errors = Off

; 开启错误日志记录(记录级别受上面配置的error_reporting影响)
log_errors = On

; 指定错误日志文件
; 注意:该日志文件需要手动建立且权限为646,否则错误信息将被写入php-fpm.conf的error_log
error_log = /program/php/log/php-script.error.log

  关于php-fpm.conf、ini_set()、php.ini配置PHP参数优先级的问题

  先说结论,在大部分配置上(有小部分是例外),优先级是:php-fpm.conf > ini_set() > php.ini。

  php-fpm.conf的配置是最高级别的,php-fpm.conf会覆盖php.ini中的相同配置,文章开头说的php-fpm.conf文件里有一个控制错误报告的总开关就是这个原因。为了方便管理最好把php-fpm.conf的部分配置删除或注释,统一通过php.ini来配置,这样可以减少不必要的麻烦。

  php-fpm.conf还有一个非常特殊的功能,就是让ini_set()失效,例如在PHP脚本里写ini_set('memory_limit', '256M')能让该脚本最多使用256M内存,但是如果服务器管理员在php-fpm.conf设置了“php_admin_value[memory_limit] = 32M”那么PHP脚本的ini_set('memory_limit', '256M')设置就会无效。想控制其它PHP参数无法被ini_set()修改也一样,只要在php-fpm.conf文件里使用php_admin_value[xxxxx]或php_admin_flag[xxxxx]的格式来配置PHP参数即可。

  php-fpm.conf的error_log和php.ini的error_log有什么区别?
 
  php-fpm.conf的error_log是记录PHP-FPM运行错误的日志文件硬盘路径(注意:不是记录PHP脚本执行错误),它可以结合log_level来一起配置,log_level的可选值有:alert(必须立即处理)、error(错误情况)、warning(警告情况)、notice(一般重要信息)、debug(调试信息),缺省值为notice。在设置了error_log并且log_level缺省的情况下,每次重启php-fpm都会往error_log指定的日志文件写入几条notice信息记录php-fpm的停止运行和开始运行,这些notice信息对服务器日常维护用处不大,所以一般只需要将log_level设为warning即可。
 
  php.ini的error_log是记录PHP脚本执行错误的日志文件硬盘路径,它和普通PHP脚本一样也受error_reporting的限制只会记录对应级别的错误。

Copyright © 2024 码农人生. All Rights Reserved