生产环境php报错必须禁用display_errors并启用log_errors记录日志,且配置须在php.ini或fpm池中设置,而非仅用ini_set;框架还需关闭app_debug等调试开关,并用register_shutdown_function捕获fatal error。

生产环境 PHP 报错不能靠“隐藏”来解决,而是必须让错误不显示给用户、但完整记录到日志——display_errors = Off 是底线,不是全部。
display_errors = Off 为什么必须在 php.ini 里设,不能只用 ini_set?
因为 ini_set('display_errors', '0') 在脚本运行时才生效,而某些致命错误(比如语法错误、类未定义、require 失败)会在解析阶段就中止执行,根本没机会走到 ini_set 那一行。
-
display_errors = Off必须写在php.ini或 php-fpm pool 配置的php_admin_flag[display_errors] = off中,才能覆盖所有执行路径 - Apache 下若用了
.htaccess,也要加php_flag display_errors off,但优先级低于 php.ini,仅作兜底 - 验证是否真正生效:用
php -i | grep display_errors查 CLI 模式;用phpinfo()页面查 Web SAPI 模式;再故意触发一个Notice(如访问未定义变量),看页面是否真的一字不吐
关了 display_errors,错误就真的“消失”了吗?
不会。关掉只是不让它出现在浏览器里,错误本身仍在触发、仍可被记录——前提是 log_errors = On 且路径可用。
-
log_errors = On必须同步开启,否则等于把错误扔进黑洞 -
error_log = /var/log/php/error.log要用绝对路径,并确保 PHP 进程用户(如www-data)对该文件或目录有写权限 - 避免设成空值或
syslog:空值会退化到 Web 服务器日志(如 Apache 的error_log),分散难查;syslog缺少请求上下文(URI、IP、POST 数据),定位效率低 -
error_reporting别设成0或E_ALL:推荐E_ALL & ~E_DEPRECATED & ~E_STRICT,既覆盖常见问题,又避免E_NOTICE日志刷屏掩盖真正故障
框架里关 display_errors 还不够,APP_DEBUG 也得关
Laravel、Symfony 等框架自带错误处理器,会绕过 PHP 原生配置直接渲染调试页——display_errors = Off 对它们无效。
- Laravel:必须设环境变量
APP_DEBUG=false,否则即使display_errors = Off,Whoops 仍会完整暴露堆栈和$_ENV - Symfony:需同时设
APP_ENV=prod和APP_DEBUG=0,并运行php bin/console cache:clear清缓存,否则旧配置可能残留 - 自建框架或原生项目:检查是否调用了
set_error_handler或register_shutdown_function,这些函数可能重新打开输出通道
Fatal Error 怎么办?别想“隐藏”,要捕获
@ 运算符对 Fatal Error 完全无效;display_errors = Off 也拦不住 stderr 直接输出。真正该做的是用 register_shutdown_function 捕获并落盘。
- 入口文件最开头注册关机函数:
register_shutdown_function(function () { $e = error_get_last(); if ($e && in_array($e['type'], [E_ERROR, E_PARSE, E_COMPILE_ERROR])) { error_log(json_encode($e), 3, '/var/log/php/fatal.log'); } }); - 注意:别在 shutdown 函数里再调用可能出错的操作(比如写日志失败引发新错误),也别依赖
ob_end_clean()—— CLI 模式下它根本不存在 - CLI 脚本尤其要小心:
display_errors = Off+log_errors = Off+error_reporting = 0组合看似“静默”,实则等于放弃所有线索,线上严禁
最常被忽略的点是:display_errors = Off 后没人检查日志是否真在写入。很多故障不是没报错,而是错写了、写错了地方、或权限被拒却没告警——先确认 error_log 文件存在且可写,再谈其他。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











