线上环境必须关闭display_errors以防敏感信息泄露,需逐层检查php.ini、.htaccess、nginx fastcgi_param及框架配置(如thinkphp的app_debug),并验证local value为off;同时开启log_errors并确认日志真实写入。

线上环境必须关掉错误提示,否则数据库密码、文件路径、类名结构都可能直接暴露在页面上。这不是“要不要”的问题,而是“不关就等于裸奔”。
确认当前 display_errors 真实值
别只改 php.ini 就以为完事了。PHP 的 display_errors 会被多层覆盖,最终生效的值得现场查:
- 在入口文件
public/index.php顶部加一行:var_dump(ini_get('display_errors'));,访问首页看输出是"1"还是"0" - 或者部署一个临时
info.php,内容为<?php phpinfo(); ?>,搜索 “display_errors” 行,重点看 “Local Value” 列 - 如果显示为
On或1,说明某处主动开启了它——不是没改对,而是被后来的设置盖掉了
逐层关闭 display_errors
关不掉的常见原因就三类:Web 服务器配置、框架自身调用、运行时函数。必须全部堵住:
- Apache 用户检查
.htaccess或虚拟主机配置里有没有php_flag display_errors on,改成off或直接删掉 - Nginx 用户检查
fastcgi_param PHP_VALUE是否重复写了display_errors=1,确保只有一处且值为0 - ThinkPHP 项目里搜
ini_set('display_errors'和error_reporting(,尤其检查public/index.php、thinkphp/start.php和自定义中间件 -
.env文件中必须有APP_DEBUG=false,且不能被代码里define('APP_DEBUG', true)覆盖
关显示 ≠ 关日志,必须配 error_log
关掉页面输出只是第一步。错误还在发生,不记录就等于没发生过:
- 确保
php.ini中log_errors = On且error_log = /var/log/php_errors.log(路径需 PHP-FPM 用户有写权限) - ThinkPHP 自身日志也要开:
config/app.php里确认'log' => ['level' => ['error']],并检查runtime/log/目录归属是否为www-data或nginx - 别信“我开了 log 就行”,上线前用
trigger_error('test', E_USER_ERROR)手动触发一条,确认它真进了日志文件
最常被忽略的一点:ThinkPHP 在 APP_DEBUG = false 时仍可能因中间件或异常处理器里的 echo、var_dump 导致敏感信息泄露。生产环境所有调试语句必须清零,连注释里的 // dump($data) 都得删干净。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











