后台一进去就白屏,先看这两个地方再动手改代码

· zblog · 阅读 8
摘要

上周有个读者的站,后台一进就白屏,连登录框都不给看。他把 PHP 错误日志截图发过来,第一行是 Fatal error: Call to undefined function,路径指着他自己往 include.php 里加的那行。 这种我见

上周有个读者的站,后台一进就白屏,连登录框都不给看。他把 PHP 错误日志截图发过来,第一行是 Fatal error: Call to undefined function,路径指着他自己往 include.php 里加的那行。

这种我见过太多次了。大部分人第一反应是去翻源码、去回滚版本,其实方向反了——先看日志。

后台白屏排查

日志文件在 zb_users/logs/ 下

Z-Blog 的错误日志默认落在 zb_users/logs/,文件名里带日期,具体格式各版本不太一样,进去 ls 一眼就知道。挑最新的那个 tail -n 100,通常 Fatal 就在末尾。

如果这个目录是空的,说明记录没开。后台「网站设置」里有两个容易搞混的项:

  • 调试模式:开了之后错误页会带堆栈,是给浏览器看的。
  • 记录错误日志:往上面那个目录里写文件。

两个是独立的开关,我一开始也以为开一个就都有了。排查的时候两个都打开,复现一次,日志就有了。别忘了完事关掉,调试模式挂线上会把你不想给人看的东西也吐出来。

先分清是 PHP 挂了还是模板挂了

这点很好判断。页面上一片纯白、HTTP 500,八成是 PHP 层;页面有结构、但某块内容是空的,那是模板或标签的问题。

# 复现一次后看看最近写了什么
ls -lt zb_users/logs/ | head -3
tail -n 50 zb_users/logs/xxxx.log

500 又没有日志,那就是 PHP 自己都没跑起来。这种要去服务器层看,宝塔面板的 PHP 错误日志、或者 php-fpm 的 log。我遇到过一次是 opcache 缓存了旧的编译结果,文件改了但跑的还是老代码——重启 php-fpm 立刻好了。

报错里的路径值得多看两眼

日志最后几行通常是调用栈,从上往下是「谁调了谁」。真正出事的行往往在最上面,下面那些是「被谁触发」。看反了会一直盯着 index.php 看,没用。

还有 Permission denied 这种,别看代码了,去查文件权限和属主。宝塔上用 www 跑的站,目录给 755、文件 644,属主给 www,基本不会错。这个我踩过,改了半天代码,最后是 chown 一条命令的事。

我的处理顺序

白屏 → 看 HTTP 状态码 → 500 就翻日志 → 日志里第一条 Fatal 的行号和文件 → 打开对应文件看那一行前面几行 → 还没头绪就删缓存、重启 fpm。

顺带一句,改之前先备份。这行话听着像废话,但我见过太多人慌起来直接手改线上文件,改完连原来长什么样都不记得了。