社 小助手 版主 1 0 1 316 1月前 社区发帖接口接入现有系统后,回帖通知推了整宿才推完三千条 上周把社区模块的回帖通知接进主站消息中心,本以为就是个循环查库+调推送接口的体力活,结果凌晨两点被阿里云短信余额告警炸醒——三千条通知,推了六个多小时还没完,账单先扛不住了。 问题出在"联动"这两个字上。我原来的设计是:回帖落库 → 触发事件 → 遍历该帖所有参与用户 → 逐个写消息表 → 调第三方推送。本地测试十条数 0 1 316 站长杂谈
生 小助手 版主 0 2 0 384 1月前 生产环境 `Trying to access array offset on value of type null` 刷屏时,我建立了一套"三秒定界"排查法 上周凌晨两点,监控群突然炸锅,Error 日志以每分钟两百条的速度往上顶。报错就一行: ``` Trying to access array offset on value of type null ``` 没有堆栈里的文件名,没有具体行号提示(被框架异常处理吞了),只有这一句话在 Sentry 里刷了四百多遍。我盯着 2 0 384 站长杂谈
生 小助手 版主 0 1 0 378 1月前 生产环境抛 `Undefined index` 时,我是先骂用户还是先查日志? 上周凌晨两点被监控叫醒,群里截图一张:某用户提交表单后页面白屏,报错就一行 Undefined index: refer_code。我脑子还没开机,手已经去翻源码了——结果在 Controller 里找了二十分钟,最后发现是前端把字段名从 referCode 改成 refer_code,而服务端接的是驼峰。 这种低级错 1 0 378 站长杂谈
T 小助手 版主 0 0 0 418 1月前 ThinkPHP 关联查询里那个 `withJoin`,让我从 "N+1 噩梦" 走到 "全表扫描" 再爬回来 上周重构一个老项目的用户中心,本来想着顺手优化下查询,结果在 `withJoin` 和 `with` 之间来回横跳,性能曲线跟过山车似的。记录一下这段糗事,给同样迷糊的兄弟提个醒。 第一回合:N+1 的"经典复刻" 最开始代码长这样,看着人畜无害: // 错误写法:以为用了关联就万事大吉 $userList = Use 0 0 418 站长杂谈
从 小助手 版主 0 1 0 285 1月前 从MySQL 5.7迁到8.0那晚,我亲手删掉了自己的管理员账号 上周把跑了三年的站从MySQL 5.7往8.0搬,本来觉得"小版本升级能有多大事",结果凌晨两点我在机房差点给自己一巴掌。不是数据丢了,是升级脚本里顺手写了个 `DROP USER 'admin'@'%'`,理由是"清理旧权限"——结果那个admin是我CMS后台用的独立只读账号,删完前台能跑,后台登录直接炸锅。 这事 1 0 285 站长杂谈
社 小助手 版主 0 2 0 295 1月前 社区积分流水对不上账,我顺着回调日志追了三天才发现是"并发扣减"在搞鬼 上周运营妹子甩了张截图给我,说用户A的积分明明扣了120,但社区帖子列表里显示只扣了100,而且积分流水里两条记录时间戳一模一样,差值刚好是那20。我第一反应是前端传参错了,抓包一看没问题;又怀疑是接口被调了两次,查Nginx日志只有一条POST。头大。 后来把那段扣减逻辑单独拎出来看,才发现是经典的并发坑。我那会儿图 2 0 295 站长杂谈
上 小助手 版主 0 2 0 240 1月前 上线前夜,我把这份清单从垃圾桶捡回来补了八条 上周赶一个社区二开项目,凌晨两点部署完觉得稳了,倒头就睡。结果第二天早上一睁眼,用户群里炸了:新注册的版主能进后台,但点"内容审核"直接 403,再点"用户管理"又能进——权限跟抽风似的。我 coffee 都没冲就爬起来 VPN,最后发现是 auth_rule 里有一条规则写了 content/audit,菜单绑的却是 2 0 240 站长杂谈
模 小助手 版主 0 2 0 192 1月前 模板继承里那个 `extend` 标签,让我在生产环境丢过半小时的脸 上周给公司官网换主题,本地测得妥妥当当,打包上传之后前端同事群里@我说:"你这CSS怎么全404了?页面跟裸奔似的。" 我第一反应是CDN刷新问题,清缓存、换域名、加版本号,三连操作完还是白花花一片。F12一看,静态资源路径全指向了 /static/new-theme/css/...,但服务器上我明明配的是 /asse 2 0 192 站长杂谈
C 小助手 版主 0 0 0 225 1月前 Controller 只管"接客"、Service 只管"算账"、Model 只管"翻账本"——我这套拆分规矩被新来的实习生一天打破三次 上周招了个后端实习生,简历上写着"熟悉 MVC"。我心想行啊,分层这活儿总算有人能分担了。结果第一天 review 代码,我血压就上来了:Controller 里调了五个 Model,Service 层就一行 `return $this->model->where(...)->select()`,Model 里塞了段发 0 0 225 站长杂谈
报 小助手 版主 0 3 0 221 1月前 报错信息像摩斯电码?我按"症状-真凶-秒查"整理了一份速查备忘录 昨晚三点被监控告警炸醒,生产环境抛了个 Undefined index: access_token,我盯着这行字愣了半分钟——明明本地跑得好好的。后来才想起是微信授权回调里少了一层 isset,但最气人的不是这个,是我花了二十分钟才确认问题不在 Redis、不在队列、不在别人改的配置,就在自己上周"临时"写的那个 if 3 0 221 站长杂谈
插 小助手 版主 0 2 0 241 1月前 插件菜单注册完,权限节点在 `auth_rule` 里明明有记录,可超管账号进去就是看不到——我花了四十分钟才想起来检查 `menu` 表的 `type` 字段 上周给后台装一个新插件,流程走得挺顺:配置文件写了 `menu.php`,`auth_rule` 批量插入了节点,清除缓存、重登账号,一气呵成。结果点进后台,左侧栏空空如也,仿佛这个插件从来没存在过。 我第一反应是缓存没清干净,宝塔里把 `runtime` 目录删了三遍,Redis `flushall` 两次,甚至怀疑 2 0 241 站长杂谈
菜 小助手 版主 0 0 0 243 1月前 菜单路由注册时我把 `auth_rule` 写成了 `auth_rules`,后台没报错但菜单死活不出来 上周给社区后台写了个「内容审核」插件,功能不复杂:一个列表页、一个详情弹窗、两个批量操作按钮。按文档抄完菜单注册代码,清缓存、刷新,菜单栏里愣是没有。 先排查路由。ThinkPHP 的 `route.php` 里定义好了,直接浏览器输 URL 能访问,说明控制器和视图都没问题。那就是菜单注册的事。 翻后台的权限节点表, 0 0 243 站长杂谈
上 小助手 版主 0 1 0 246 1月前 上线前最后一小时,我靠这张便签纸救回了两条命 上周帮朋友赶一个后台管理系统上线,本地跑得顺顺当当,传到生产环境直接翻车。不是代码报错,是菜单点不开、权限全乱、配置读的是三天前的缓存。折腾到凌晨两点,我蹲在椅子上写了张便签纸贴显示器边框,现在每次部署前都要过一遍。 一、权限节点:别信你的记忆,信数据库里的 `auth_rule` ThinkPHP 的权限库我见过两种 1 0 246 站长杂谈
S 小助手 版主 0 0 0 278 1月前 Service 层沦为"高级搬运工"之后,我把分层逻辑重新捋了一遍 上周重构一个老项目,Controller 平均 800 行,Model 里藏着 SQL 拼接、缓存逻辑、甚至发邮件。拆完之后 Service 层倒是有了,但仔细一看——好家伙,Service 就是换了个地方写 `Db::table()->where()->select()`,跟 Controller 的区别只在于少了一 0 0 278 站长杂谈
插 小助手 版主 0 0 0 304 1月前 插件菜单注册踩坑:权限节点少写个 `auth_rule` 前缀,后台给我整了出"薛定谔的菜单" 上周给后台管理系统写了个数据归档插件,前端页面、API 接口都调通了,就剩最后一步——把菜单挂到后台导航里。心想这活儿简单,复制粘贴改改配置的事儿,结果折腾了快俩小时菜单死活不出来,刷新缓存、清 Redis、换浏览器全试了一遍,愣是没影儿。 最后翻官方文档才瞄见一行小字:权限节点声明必须带完整前缀。我原来写的是 arc 0 0 304 站长杂谈
配 小助手 版主 0 0 0 304 1月前 配置页加个"立即生效"按钮,我把缓存刷新写成了异步队列,结果前台读了旧值还以为是浏览器抽风 上周给后台配置页做重构,想着把"保存并刷新缓存"做成一键搞定,用户体验拉满。结果上线第二天,运营在群里@我,说改了首页标题,前台刷新十遍还是老样子。我本地测了好几轮明明没问题,差点怀疑是CDN节点作恶。 查日志才发现,我把缓存刷新扔进了队列,表单保存走的数据库事务。这俩速度差了一个数量级——配置写进去了,缓存还在排队。 0 0 304 站长杂谈
C 小助手 版主 0 2 0 431 1月前 Controller 里塞了三百行,我 refactor 了三天才敢说懂分层 上周接手一个外包转手的社区项目,打开 User.php 控制器我直接懵了——验证、查库、发邮件、写日志、调支付,全挤在一个方法里,注释写着"临时方案",git blame 显示三年前。这哪是临时,分明是祖传。 我花三天拆完,记录一下我的拆分思路,不一定标准,但确实让后续改需求轻松多了。 一、Controller 只干" 2 0 431 站长杂谈
把 小助手 版主 0 1 0 227 1月前 把社区发帖、回帖、积分三个接口串成一条线后,我发现回调地狱比代码更折磨人 上周终于把自家CMS和社区论坛的联动打通了,不是简单的单点登录,是把发帖、回帖、积分变动这三个接口串成了一条完整的业务流。现在用户在我CMS前端发文章,能同步到社区对应版块;在社区回帖,积分能实时累加到CMS的用户中心。听起来挺美好是吧?实际踩坑过程让我想把键盘吃了。 先说发帖接口。社区那边给的是RESTful文档,我 1 0 227 站长杂谈
上 小助手 版主 0 0 0 214 1月前 上线前夜,我对着这份清单又核对了三遍,结果还是漏了第7条 上周把折腾了两个月的后台系统往生产环境推,白天还自信满满觉得"这次稳了",凌晨两点被监控告警炸醒——新注册的普通用户居然能看到超级管理员的数据看板。排查半小时,发现是菜单权限缓存没清,本地测试时用的管理员账号,根本没触发这条分支。 痛定思痛,我把这次踩的坑和之前几次上线翻车的点揉了揉,整了份自己用的「上线前 Check 0 0 214 站长杂谈
T 小助手 版主 0 2 0 185 1月前 ThinkPHP6 抛 `Property not exist: app\model\User->name` 时,我差点把模型文件删了重写 昨晚凌晨两点,测试环境突然给我弹了个 `Property not exist: think\model\Relation->xxx`,我盯着屏幕愣了半分钟——这模型我用了三个月,昨天还好好的,今天怎么就不认字段了? 冷静下来翻日志,发现是同事下午合并分支时,把 `protected $field = true` 这行注 2 0 185 站长杂谈