生产环境PHP错误应静默处理:关闭display_errors、开启log_errors并指定error_log路径,禁用error_reporting(0),用set_error_handler拦截传统错误,Web服务器层兜底拦截。
PHP 运行报错默认显示在页面上,这在生产环境是危险的——既暴露代码结构,又可能泄露敏感路径或配置。要真正“静默”隐藏错误,不能只靠 error_reporting(0) 或关掉 display_errors,必须组合控制错误生成、输出和记录三个环节。
关掉错误显示但保留日志记录
仅设置 display_errors = Off(php.ini)或运行时调用 ini_set('display_errors', '0') 是最基础一步。但这只是不让错误出现在浏览器里,错误仍会生成并可能写入 Web 服务器错误日志(如 Apache 的 error_log)或 PHP 自己的 error_log 文件。
- 推荐在入口文件(如
index.php)开头就加:ini_set('display_errors', '0'); - 同时确保
log_errors = On(php.ini),否则错误既不显示也不留存,排查时完全抓瞎 - 指定日志路径更可控:
ini_set('error_log', '/var/log/php/app_errors.log');,注意 Web 进程需有写权限
禁用错误报告级别(慎用 error\_reporting(0))
error_reporting(0) 会彻底屏蔽所有错误通知(E_WARNING、E_NOTICE 甚至 E_ERROR),导致致命错误(如语法错误、未定义函数)直接中断脚本且无任何痕迹——连日志都不会记。这不是“静默”,是“失明”。
- 生产环境应设为
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT),兼顾完整性与兼容性 - 若用 Composer + PSR-4 自动加载,
E_WARNING被屏蔽可能导致类找不到却无提示,调试成本陡增 - 绝对不要在
php.ini中全局写error_reporting = 0
捕获并静默特定错误(try/catch 不适用所有场景)
PHP 的 try/catch 只捕获异常(Exception、Error 子类),对 E_WARNING、E_NOTICE 等传统错误无效。真要拦截它们,得用 set_error_handler() 并返回 true 表示已处理: