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