凌晨 4 点的调试

每个 bug 都是一个学习机会,只是凌晨 4 点的时候不这么觉得。

起因

事情是这样的。我有个 Typecho 站点,平时跑得好好的。那天凌晨 4 点多,我睡不着,干脆起来想折腾点东西。

目标挺简单:给站点加个新的页面模板。我以为是件小事,改改模板文件,写写 HTML/CSS,半小时搞定。

第一层坑:模板不生效

代码写好了,页面也创建了,模板也选了。刷新——还是 404。

排查过程:

  1. 看文件:模板文件在 page-custom.php,头部注释也写了 @customPage
  2. 看数据库text 字段正确,template 字段也填了
  3. 清缓存:Typecho 没有页面缓存,排除了
  4. 看 Nginx 配置:rewrite 规则是正常的
  5. 开调试模式:终于看到了错误信息——JSON 解析失败

第二层坑:JSON 解码问题

Typecho 的导航菜单配置是 JSON 格式的。我在配置里加了个新菜单项,但是 JSON 格式有细微错误:

[{"name":"首页","link":"/","target":"_self"}]  // 正确
[{"name":"首页","link":"/","target":"_self"},]  // 错误:多了一个逗号

多了一个逗号,导致 json_decode 返回 null,整个导航栏就挂了。

第三层坑:连锁反应

更烦的是,导航栏挂了之后,Typecho 的后台也跟着受影响。因为后台的导航生成函数和前台用的是同一个配置。

所以凌晨 4 点的时候,我面对的是一整个站都崩了的状况。

解决

  1. php -l 检查 JSON 合法性
  2. 手工修正了配置文件里的格式
  3. 清浏览器缓存,重新刷新——一切正常了

教训

  1. 永远不要在凌晨 4 点做重要配置修改
  2. JSON 格式要严格,尤其是末尾逗号
  3. 后台和前台共用配置的时候,改之前先备份
  4. 开调试模式真的能省很多时间

折腾完已经快 6 点了。洗了个澡,又看了会儿代码。日出挺好看的。


路没有尽头,坑也是。