必须开启 display_errors = On 并设置 error_reporting = E_ALL & ~E_NOTICE & ~E_WARNING,同时检查 .user.ini 是否覆盖配置、确认 Nginx 错误日志路径有效且可写,Parse error 只记录在 Nginx 错误日志而非 PHP 日志中。

display_errors = On 必须开启,否则 PHP 错误永远只写日志、不显示在页面上——这是绝大多数人卡住的第一步。
怎么快速让错误信息直接打到浏览器上
核心就是改 PHP 的两个开关:display_errors 和 error_reporting。宝塔里最稳妥的做法是进对应 PHP 版本的设置页改全局配置,而不是靠 .htaccess 或根目录 php.ini 临时覆盖(后者容易被 .user.ini 拦截或权限拒绝)。
- 登录宝塔 → 软件商店 → 找到你站点用的 PHP 版本(比如
PHP 8.1)→ 点击「设置」 - 切到「配置修改」选项卡,搜
display_errors,改成On - 再搜
error_reporting,推荐设为E_ALL & ~E_NOTICE & ~E_WARNING—— 过滤掉提示类噪音,但保留Parse error、Fatal error这些真正要命的问题 - 点「保存」→ 右上角「重载配置」→ 到网站设置里确认 PHP 版本没被意外切换
改完立刻刷新网页,如果代码有语法错误,会直接看到类似这样的红字:Parse error: syntax error, unexpected token "{" in /www/wwwroot/example.com/index.php on line 42。
为什么开了 display_errors 却还是看不到错误
常见不是配置没生效,而是被更高优先级的规则压住了。宝塔默认允许站点根目录用 .user.ini 覆盖 PHP 设置,而这个文件一旦存在且写了 display_errors = Off,上面所有操作都白干。
- 进网站根目录(如
/www/wwwroot/example.com/),看有没有.user.ini - 如果有,打开它,检查是否含
display_errors = Off或log_errors = Off;注释掉或删掉这行 - 改完不用重启 PHP,但要等约 2 分钟缓存刷新,或执行命令
bt 11手动重载 - 顺手检查下「禁用函数」列表里有没有禁掉
ini_set—— 如果禁了,连 PHP 脚本里用ini_set('display_errors', '1')都会失败
错误日志路径不对,导致查不到 Parse error
Parse error 是编译期错误,不会进 PHP 的 error_log 文件(那个主要记运行时错误),而是直接写进 Nginx/Apache 的错误日志。很多人死盯 /www/wwwlogs/php_error.log,结果什么都没有。
- 查站点级错误日志:网站 → 设置 → 日志 → 点「错误日志」右侧的「查看」
- 或者 SSH 直接看:
tail -f /www/wwwlogs/example.com.error.log(注意是.error.log,不是.log) - 如果日志里空空如也,去网站配置的「配置文件」选项卡里搜
error_log,确认 Nginx 配置中该站点的error_log指令没被注释掉,路径可写(比如指向/www/wwwlogs/example.com.error.log)
另外,Nginx 主错误日志(/www/wwwlogs/nginx_error.log)也会记录 worker 异常退出之类底层问题,语法错误触发 PHP-FPM 崩溃时,这里可能有线索。
生产环境不能开 display_errors,怎么安全调试
线上站点绝不能让错误信息暴露给用户,但关掉后又难定位问题。折中方案是:关掉前端显示,但确保错误完整落盘 + 实时可查。
- 把
display_errors = Off,但保持log_errors = On和error_log = /www/wwwlogs/example.com/php-error.log - 确保该日志路径所在目录存在且
www用户有写权限:chown -R www:www /www/wwwlogs/example.com/ - 用
tail -f /www/wwwlogs/example.com/php-error.log在终端盯着,同时复现用户操作 - 如果日志始终为空,检查
.user.ini是否覆盖了log_errors,或 PHP-FPM 池配置里catch_workers_output = yes是否开启(影响子进程 stderr 输出)
真正容易被忽略的是:Nginx 错误日志和 PHP 错误日志是两套体系,Parse error 只进前者,Warning 类才可能进后者——查错前先想清楚错误类型,再选对日志文件。

















