生产环境必须关闭display_errors并启用log_errors,否则错误会直接暴露敏感信息;需通过php.ini等系统级配置关闭,运行时ini_set无效,同时须验证框架调试开关、日志路径权限及实际输出效果。

是的,小皮面板本地开发可以开 display_errors,但上线前必须关掉。
这不是可选项,而是安全底线。display_errors = On 会让 PHP 的所有错误(包括 Notice、Warning、Fatal error)直接输出到网页 HTML 中,轻则破坏页面结构,重则暴露服务器路径、数据库账号、变量内容甚至代码片段——攻击者可能凭这些信息发起进一步渗透。
小皮面板里怎么确认 display_errors 状态?
打开小皮面板 → 点击「PHP 设置」→ 找到你当前用的 PHP 版本 → 点击「配置文件」进入 php.ini。
搜索这两行:
display_errors = On error_reporting = E_ALL
- 本地开发时:可设为
On+E_ALL,方便快速定位问题; - 上线部署时:必须改为:
display_errors = Off error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT log_errors = On error_log = /www/wwwlogs/php_error.log
改完记得点击面板右上角「重载配置」或手动重启 PHP-FPM(小皮界面有对应按钮)。
为什么不能只在代码里 ini_set('display_errors', '0')?
因为 display_errors 是 PHP_INI_SYSTEM 级别指令,运行时无法修改。你在 index.php 开头写:
ini_set('display_errors', '0');
完全无效,PHP 会直接忽略。必须通过 php.ini、.user.ini(小皮支持)、或 PHP-FPM pool 配置来设。
小皮多 PHP 版本共存时,还要注意:
- 子目录可能继承了旧版本的
.user.ini; - 面板切换 PHP 版本后,扩展和配置未必自动同步。
关了 display_errors,错误就没了?不是
关掉只是不让错误“显示”,不代表错误不发生。必须同时确保:
-
log_errors = On -
error_log指向的路径(如/www/wwwlogs/php_error.log)对www用户可写 - 目录权限正确:
/www/wwwlogs/应为755,属主www:www
否则错误既不显示,也不记录——等于“静默失败”,排查起来更难。
框架项目额外要检查什么?
小皮跑 Laravel、ThinkPHP、Django-PHP 类项目时,原生 PHP 配置只是第一层:
- Laravel:
.env中APP_DEBUG=true会强制启用 Whoops 错误页,无视display_errors,必须设为false并清缓存(php artisan config:clear); - ThinkPHP:检查
app_debug是否为false,尤其确认加载的是生产环境配置; - 自研项目:排查入口文件是否硬编码了
ini_set('display_errors', '1')或error_reporting(E_ALL)。
最后验证是否真关掉了?
别只看 phpinfo(),要做实际测试:
- 在页面中加一行触发 Notice 的代码,比如:
echo $undefined_var;
- 刷新页面,观察:
- 页面是否空白(无
Notice:字样) - 浏览器开发者工具 → Network → Response 中是否含错误文本
- 同时查看
/www/wwwlogs/php_error.log是否新增了对应日志
- 页面是否空白(无
只有日志有记录、页面没输出,才算真正生效。
不复杂但容易忽略











