上线前夜,我把这份清单从垃圾桶捡回来补了八条

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 112 浏览 0 回复

上周赶一个社区二开项目,凌晨两点部署完觉得稳了,倒头就睡。结果第二天早上一睁眼,用户群里炸了:新注册的版主能进后台,但点"内容审核"直接 403,再点"用户管理"又能进——权限跟抽风似的。我 coffee 都没冲就爬起来 VPN,最后发现是 auth_rule 里有一条规则写了 content/audit,菜单绑的却是 content.audit,ThinkPHP 的权限校验走斜杠,菜单渲染走点号,数据库里两条记录井水不犯河水,超管有所有节点所以没事,版主按角色一匹配就裂开了。

这事之后我把之前随手扔的半张 checklist 捡回来,重新补全。现在每次上线前过一遍,大概能拦住七成的低级事故。不是那种万能模板,是我自己的血泪补丁,挑几条能复用的说说。

一、权限节点:别信"看起来一样"

我现在强制要求权限标识全走统一命名,菜单表、规则表、角色配置三方对账。以前觉得 admin/article/indexadmin.article.index 差不多,现在用脚本扫一遍差异,哪怕多一个点也标红。还有个小坑:如果用了插件机制,插件安装时自动写入的 auth_rule 可能带插件前缀,但手动补的角色权限忘了加,这种半自动半手动的配置最容易漏。

二、路由:本地能跑不算数,CLI 模式再测一遍

Web 路由正常,但后台的定时任务、队列消费者走 CLI,路由解析逻辑可能不一样。我吃过亏:一个导出功能 web 端下载正常,凌晨的自动报表任务报 "Route not found",因为定时任务没加载某个路由分组。现在上线前必做一步——把核心接口用 php think 模拟调一遍,或者至少确认 CLI 入口和 Web 入口加载了同一份路由配置。

三、菜单:新加的项,拿"纯净角色"账号过一遍

超管账号看菜单全是绿的,测不出问题。我建了个"测试版主"角色,权限给得抠抠搜搜,每次新菜单上线就用这个账号点。有次插件注册了二级菜单,父级菜单的 type 写成 0(目录)但底层逻辑按 1(菜单)去查权限,超管能展开,普通角色整个分支消失。纯净角色账号就是照妖镜。

四、配置:环境变量和数据库配置,以谁为准要写死

最烦的是配置来源打架。.env 里写了缓存驱动 redis,后台配置表里是 file,代码里某处又 hardcode 了个 memcache。我现在约定:框架级配置(数据库、缓存、调试开关)以 .env 为准,业务级配置(积分规则、审核阈值)走数据库配置表,代码里不允许第三种写法。上线前 grep 一遍项目,搜 Config::getenv(,看看有没有混用的。

五、文件权限:别忘了 runtime 和 upload

这个太基础但太容易忘。代码拉上去,runtime 没写权限,日志写不进去,报错信息又进不了日志,死循环。还有上传目录,本地开发用软链或者绝对路径习惯了,生产环境 public/upload 的权限和所有者可能不对,用户头像传完 404,一查是 nginx 没读取权限。我现在部署脚本里强制 chmod 755chown www:www,哪怕重复执行也写进去。

六、最后一条:改完 checklist,自己先按流程走一轮

清单是死的,人是活的。我这份从半张纸补到十八条之后,发现第 3 条和第 11 条其实说的是一回事,合并了;第 15 条是某次特例,删掉。现在每次迭代完,我花十分钟自己当测试员完整跑一遍,比任何自动化脚本都管用——因为你知道哪里可能埋雷。

你们上线前有没有那种"明明 checklist 写了还是漏了"的玄学经历?我目前最高纪录是同一项目连续两次栽在大小写上,第三次才长记性。

评论0
回复 · 0
还没有回复
微信客服 微信客服