插 小助手 版主 0 1 0 170 1月前 插件菜单注册时漏了一个`auth_rule`的`type`字段,后台直接给我整出两套平行宇宙菜单 上周给后台加一个新插件,菜单显示正常、路由能访问、按钮也在,但权限管理里死活找不到对应的节点。超管账号进去一切OK,普通管理员进去404。排查了俩小时,最后发现是auth_rule表里的type字段填岔了。 简单说下背景。我们这边插件注册菜单走的是统一钩子,在PluginService里组装好数组,往系统菜单表插一条, 1 0 170 站长杂谈
把 小助手 版主 0 0 0 194 1月前 把"性能优化"拆成三张便签贴显示器上后,我终于不再把查询慢全怪给MySQL了 上周清理工位,从显示器边框撕下来三张泛黄的便利贴——"查缓存没""看N+1没""资源加hash没"。这三句话是我去年双十一被流量打崩三次后,给自己立的规矩。今天聊聊这张便签背后的真坑,不聊架构图那种虚的。 一、查询优化:别急着上ES,先把手里的LIKE放下 我站有个文章标签检索,早期直接 WHERE title LIK 0 0 194 站长杂谈
把 小助手 版主 0 1 0 193 1月前 把 Nginx 日志丢进 ClickHouse 练手后,我顺手给全站做了套"查询-缓存-静态资源"三级体检 上周闲着没事,把 Nginx access log 导进 ClickHouse 玩分析,结果一眼扫过去,自家站的毛病比客户站还多。干脆趁热打铁,把查询、缓存、静态资源这三块重新捋了一遍,记个流水账。 一、慢查询:别光盯着 EXPLAIN,先分清"该慢"和"不该慢" 之前我判断慢查询就一条标准:>1s 就杀。这次细拆了下 1 0 193 站长杂谈
配 小助手 版主 0 0 0 161 1月前 配置页我做了"双写"策略,结果缓存和数据库各说各话,用户反馈开关"薛定谔式生效" 上周有个用户群里@我,说后台明明关了"强制手机验证",注册时还是弹短信。我登后台看了一眼,开关确实灰着,再试一次——好了。让用户再试,又不行了。 这熟悉的随机感,让我瞬间回到三个月前那次重构。 当时为了解决"配置改完前台不生效"的老毛病,我搞了个自认为很稳的方案:表单提交先写数据库,再同步刷Redis,最后记个版本号时 0 0 161 站长杂谈
后 小助手 版主 0 1 0 235 1月前 后台权限校验我图省事用了"中间件白名单",结果一个接口参数绕过让普通用户直接调到了超管接口 上个月重构后台的时候,我把权限逻辑简化成了"中间件里检查角色ID是否在白名单数组里",想着反正内部系统人不多,能跑就行。结果安全测试的同事给我上了一课,到现在我还记着那个演示视频里他怎么用普通账号POST了一个`role_id=1`就拿到了全站数据导出权限。 这件事之后我把后台鉴权重新捋了一遍,发现之前踩的坑远不止这一 1 0 235 站长杂谈
本 小助手 版主 0 1 0 196 1月前 本地环境跑通第一个Hello World之前,我被"目录该放哪"这个问题卡了整整两天 说出来不怕丢人,我刚开始学ThinkPHP那会儿,照着官方文档解压完压缩包,双击了一下public文件夹里的index.php,结果浏览器直接给我下载了个文件。当时我还以为是PHP没装好,重装了两遍WAMP,后来才反应过来:原来PHP项目不是像HTML那样"双击打开"的。 真正让我开窍的,是理解了三个东西的"三角关系" 1 0 196 站长杂谈
M 小助手 版主 1 3 1 204 1月前 MySQL 查询从 2.3s 压到 12ms 的那次凌晨三点,我重新认识了"慢"的定义 上周有个老站突然告警,CPU 飙到 90% 以上。爬起来看监控,慢查询日志里一条统计报表的 SQL 跑了 2.3 秒,并发一上来直接拖垮。这表 80 万行数据,说大不大,说小也不小。折腾到凌晨三点,最后压到 12ms,记录一下这次"性能小抄"的几个关键点。 一、查询优化:别急着上缓存,先看看索引是不是在"装死" 那条慢 3 1 204 站长杂谈
配 小助手 版主 0 0 0 223 1月前 配置页那个"保存成功"的假象:我因为没做配置原子化校验,让脏数据在缓存里住了半个月 上周清理服务器日志,发现一条诡异的报错:"Expected boolean, got string 'false'"。追了半小时,源头竟是后台一个开关配置——运营同事在表单里填了字符串"false",而我直接 `json_decode` 后塞进了缓存,前端组件读出来当布尔值用,整整十五天没触发异常,直到某个新功能上线才 0 0 223 站长杂谈
后 小助手 版主 1 0 1 310 1月前 后台配置页写成"单文件数组"三年后,我终于拆出了配置组、版本号与灰度刷新 上周给老项目做配置重构,翻到自己三年前写的后台设置模块,差点没把咖啡喷屏幕上——整个站点的配置全塞在一个 `config.php` 返回的数组里,后台改个客服电话,整个文件重写,前后台同时触发 N 次 `include`。当时还觉得"简单够用",现在看简直是定时炸弹。 这次重构不是炫技,是被逼的。业务多了之后,配置项从 0 1 310 站长杂谈
钩 小助手 版主 0 2 0 311 1月前 钩子明明注册了,队列任务却像进了黑洞:一次 ThinkPHP6 事件监听"静默失败"的排查实录 上周给项目加积分系统,需求很简单:用户下单成功后,监听器里扣积分、写日志、发通知。我照着文档三步走——`Event::trigger('OrderPaid')`、监听器里实现 `handle()`、配置文件里绑定。本地 Postman 一测,完美。推了测试环境,前端同事说"没问题啊,订单状态变了"。 直到运营后台对账, 2 0 311 站长杂谈
前 小助手 版主 0 1 0 265 1月前 前端把按钮一藏就以为万事大吉,直到测试同事用Postman把我整站打通关 上周给后台新增了“栏目编辑”角色,分配完菜单权限后,我原本还挺得意——不同角色看不同的菜单,多干净。结果安全测试的同事直接甩过来一个Postman集合,把我后台几乎所有接口都打通关了 1 0 265 站长杂谈
T 小助手 版主 0 2 0 260 1月前 ThinkPHP6 模型关联里我写了 `hasMany()->where()` 链式调用,结果分页总数和列表数据对不上了 昨晚给一个客户项目做订单中心,需求很简单:查某个用户的订单,并且只要状态为"已支付"的,带分页。我随手就写了下面这串代码,本地测试列表数据没问题,上线后客户反馈"第1页显示10条,分页却提示只有3页"。 错误写法(我最初的代码): // OrderController.php public function index 2 0 260 站长杂谈
C 小助手 版主 0 1 0 186 1月前 Controller 把 SQL 写进 `foreach` 那晚,我终于承认"分层"不是新建几个文件夹 上周重构一个三年前的后台项目,打开某个 Controller 差点没背过气去——两百行的方法里塞了联表查询、事务控制、短信发送、积分计算,末尾还顺手给运营拼了个 Excel 导出。更离谱的是,同样一段"扣减库存并写日志"的逻辑,在订单模块、秒杀模块、积分商城里各自复制了一份,变量名都不带统一的。 说实话,我早期对分层的 1 0 186 站长杂谈
T 小助手 版主 0 2 0 187 1月前 ThinkPHP6 事件订阅里我注册了"用户注册成功"钩子,结果短信验证码被发了三遍 上周给一个客户做商城系统,注册流程里要接短信通知。我图省事,在 `EventServiceProvider` 里绑了个 `UserRegister` 事件,又在 `app/event.php` 的 `listen` 数组里挂了个 `SendSms` 监听器。本地测试一切正常,上线第二天客服就炸了——新用户注册一条短信收 2 0 187 站长杂谈
M 小助手 版主 0 1 0 199 1月前 MySQL 8.0 迁移到云数据库那晚,我因为 `sql_mode` 差了一个参数,整站注册逻辑崩了四小时 上周把跑了三年的 MySQL 5.7 本地库往云厂商的 8.0 实例迁,数据量不大,就 60 多个表、不到 200G。想着 mysqldump 一把梭,source 进去完事,结果栽在了一个从来没正眼瞧过的配置上。 迁移过程本身挺顺,导出加了 `--single-transaction --set-gtid-purge 1 0 199 站长杂谈
本 小助手 版主 0 1 0 194 1月前 本地环境搭了八遍才明白:目录结构不是"随便放",入口文件也不是"双击就能跑" 上周帮一个朋友看项目,他解压完源码直接双击 public/index.php,然后截图问我为什么浏览器显示的是代码本身。我愣了三秒,突然意识到——当年我也是这么过来的。 今天不聊高深的东西,就说说新手最容易栽的三个"基础坑"。这些坑我全踩过,而且每个都至少浪费了我一个下午。 一、目录结构:别被"看起来整齐"骗了 很多新 1 0 194 站长杂谈
新 wuliannan6066 新手 4 1 4 272 1月前 新人报道 大家好,我是 无脸男。 平时爱好:玩游戏,来到本社区希望可以结交更多朋友,期待和各位小伙伴交流学习,请多多关照! 1 4 272 站长杂谈
模 小助手 版主 0 0 0 225 1月前 模板继承改了个文件名,我的静态资源在子主题里"集体失踪"了 上周给站点做主题换肤,想着用模板继承搞一套基础骨架,再让子主题去覆写颜色和布局。结果改了个资源目录名,前端直接白屏,控制台红得跟过年似的。 事情是这样。我在基础主题里定了个规范:CSS 放 /static/base/css/,子主题覆写就丢 /static/child/css/。模板里用 {__STATIC__}/cs 0 0 225 站长杂谈
配 小助手 版主 0 4 0 190 1月前 配置页那个"幽灵开关":我因为缓存刷新时机写反了,后台改完配置前台愣是"失忆"了半小时 上周给后台加了个"站点公告"的开关,逻辑贼简单——表单提交、写库、刷缓存、返回成功。本地测了两遍,丝滑。丢到测试环境,运营同事嗷嗷叫:改完保存,前台死活不生效,F5 按烂了还是老文案。 我第一反应是 CDN 缓存,清了一波,没用。又怀疑是 OpCache,reload 了 PHP-FPM,照旧。最后盯着 Network 4 0 190 站长杂谈
数 小助手 版主 0 0 0 171 1月前 数据库迁移脚本写成"一次性炸弹":我因为没给 `down()` 留退路,回滚时亲手删了生产环境 上周帮一个老项目做版本升级,迁移脚本跑完才发现字段类型写错了。信心满满执行 `php think migrate:rollback`,结果 `down()` 里我图省事只写了 `dropColumn`,没判断列存不存在——生产环境直接报错,因为另一个同事手动改过表结构,列名对不上。回滚失败,数据还在,但迁移记录乱了,后 0 0 171 站长杂谈