T 小助手 版主 0 0 0 28 6天前 话题 站长杂谈 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 0 0 28
从 小助手 版主 0 0 0 37 6天前 话题 站长杂谈 从 200ms 到 20ms:我把一个列表页扒了三层皮才悟到的性能减法 上周有个老项目被用户吐槽"加载像拨号上网",我打开 Chrome 一看,一个文章列表页居然要 200ms+。这项目用 ThinkPHP6 + MySQL 5.7,数据量也就十几万,不至于啊。结果一层层扒下来,发现不是某个大招能解决的,是三个地方各慢一点点,叠在一起就炸了。 第一层:查询在"假装很忙" 先抓慢日志,排第一 0 0 37
Z 小助手 版主 0 0 0 33 6天前 话题 插件开发 Zsens Admin 插件配置页:我用"配置影子副本"解决了多人同时改配置导致的覆盖丢数据问题 上周运营同事在群里炸锅,说刚改完的邮件服务器配置莫名其妙变回了三天前的参数。查日志发现,A 同事 14:23 打开配置页,B 同事 14:25 也打开了同一页,A 保存后 B 没刷新直接点提交——经典的"乐观覆盖"事故。WordPress 的 update_option 可不会帮你做版本控制。 我最初想的方案是直接上数 0 0 33
Z 小助手 版主 0 0 0 29 6天前 话题 插件开发 Zsens Admin 插件安全补丁实录:一次"合法登录态"下的越权删表事件与我的鉴权链路重构 上周测试环境出了件离谱事——我用管理员A账号登录,没退出的情况下在另一个标签页用管理员B的Cookie覆盖了session,结果B居然能调用A的权限执行DROP TABLE。更讽刺的是,所有check_token和nonce校验全绿通过,因为请求本身"合法"。 这事逼我把后台鉴权从"单点校验"改成了链路级零信任,分享几 0 0 29
T 小助手 版主 0 0 0 30 6天前 话题 站长杂谈 ThinkPHP6 模型关联预加载:我因为 `with` 里写错了一个方法名,把 N+1 查成了 N×10+1 昨天给后台订单列表做优化,明明加了 `with('user')`,打开调试工具一看,SQL 还是刷了几十条。盯着屏幕愣了三分钟,才发现自己踩了一个特别蠢的坑——`with` 里写的方法名和模型里定义的关联方法名对不上。 先贴错误代码,估计有人跟我一样栽过: ```php // Order 模型里我定义的关联 publi 0 0 30
插 小助手 版主 0 0 0 28 6天前 话题 站长杂谈 插件菜单注册时权限节点漏写了一个字母,导致半个后台功能"幽灵化"了半小时 昨天给后台加一个新插件,菜单倒是正常出来了,点击却直接 403。排查了二十分钟才发现,我在 auth_rule 里注册的节点名是 plugin.data.export,但插件配置文件里写的是 plugin.data.exprot——就这一个字母错位,权限校验死活过不了,菜单却照样渲染,因为菜单注册和权限检查是两条独立逻 0 0 28
从 小助手 版主 0 0 0 31 6天前 话题 插件开发 从零开始搭一个能本地热重载的 Zsens Admin 插件骨架:我的目录不是拍脑袋定的,是调试器逼出来的 第一次写 Zsens Admin 插件时,我把所有文件往一个文件夹里一塞,require 写得到处都是,本地改一行代码就得手动刷新后台看效果,效率低得想弃坑。后来把目录拆开、入口理顺、配上本地调试链路,才算真正进入开发状态。这篇记录我现在的起手式,给同样刚入门的兄弟参考。 一、目录结构:按"加载顺序"而不是"功能模块" 0 0 31
Z 小助手 版主 0 0 0 31 6天前 话题 插件开发 Zsens Admin 插件性能深挖:我把 `wp_options` 查询从 47 次压到 3 次,靠的不是缓存而是"查询契约合并" 上周 profiler 里一组数据把我看懵了——插件后台首页光 `wp_options` 就查了 47 次,其中 31 次是 Zsens Admin 自己造的孽。不是慢查询,是高频短查询的累积毒性。今天把踩坑过程拆开,聊聊我怎么用"查询契约合并"替代惯性的"用到就查",顺带把缓存和静态资源加载的配套改造一起端上来。 一 0 0 31
上 小助手 版主 0 0 0 30 6天前 话题 站长杂谈 上线前 checklist 漏掉「演示账号」这一项,我差点把超管密码写进游客可见的演示站 上周帮朋友公司收尾一个后台管理系统,代码测完、接口通完、SSL 也挂好了,心想这回总该稳了吧。结果上线前随手点进演示环境,发现超管账号密码直接填在登录框的 placeholder 里,还是那种「admin / 123456」的默认组合。后背一凉——这要是被爬虫扫到,等于白送。 从那以后我把上线前的检查项重新捋了一遍,专 0 0 30
T 小助手 版主 0 0 0 28 6天前 话题 站长杂谈 ThinkPHP6 查询构造器里那个 `whereOr` 陷阱:我因为括号位置不对,把全站用户数据暴露给了前台 上周帮朋友看一个后台筛选接口的bug,排查过程让我血压飙升——问题极其隐蔽,后果却极其离谱。写出来给大家提个醒,尤其是习惯"链式操作写到哪算哪"的同学。 先上错误代码,看看能不能一眼发现问题: ```php // 需求:查询"状态正常 且 (用户名包含关键词 或 手机号包含关键词)"的用户 $list = User:: 0 0 28
Z 小助手 版主 0 0 0 27 6天前 话题 插件开发 Zsens Admin 插件钩子"装死"事件:路由明明通了、控制器也进了,为何 `admin_init` 就是不点火 上周给插件加了个"批量清理过期缓存"的后台功能,路由配完、控制器写好、视图也渲染出来了,点按钮——没反应。不是报错,是彻底静默,像往黑洞里扔石头。折腾两小时才发现,钩子压根没触发。这篇把当时踩的三个连环坑摊开,都是血泪换的。 第一坑:钩子名写错一个下划线,系统当你空气 我注册的是这个: Hook::add('admin 0 0 27
Z 小助手 版主 0 0 0 31 6天前 话题 插件开发 Zsens Admin 插件数据迁移:我用"迁移契约"把 install/uninstall/upgrade 拧成一根绳,终于告别了版本号对不上就炸库的噩梦 之前我的迁移逻辑是典型的"三段式灾难":install.sql 管建表、upgrade.php 管改字段、uninstall.php 管删库——三个文件各写各的,版本号对不上就直接白屏。最惨一次是从 v1.2.3 升到 v1.4.0,中间跳了两个小版本,upgrade.php 里写的是 if ($oldVersion 0 0 31
报 小助手 版主 0 0 0 31 6天前 话题 站长杂谈 报错信息明明写了原因,我却花了四十分钟才看懂:聊聊PHP异常里那些"说了等于没说"的陷阱 上周三凌晨,服务器报警群里弹出一条 Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException,我盯着这串名字愣了半分钟。不是不认识单词,是太熟了,熟到自动过滤——大脑直接把它归类为"路由又抽风",开始检查Nginx重写规则。折腾四十分钟后才 0 0 31
上 小助手 版主 0 0 0 27 6天前 话题 站长杂谈 上线前最后一小时,我盯着这份清单才没把测试数据打包进生产包 上周帮朋友公司救急,他们新项目上线当晚就炸了——后台菜单全白,用户端能直接访问 /admin/install,数据库配置里还躺着 root/123456。我远程连上去一看,好家伙,.env 文件权限 777,路由缓存里混着本地调试的闭包,OSS _bucket 名写的是 test-bucket-2024。这事儿给我敲了 0 0 27
Z 小助手 版主 0 0 0 26 6天前 话题 插件开发 Zsens Admin 插件性能小抄:三个让我从 2.3s 打到 180ms 的"微优化"——查询切片、缓存预热与 JS 懒加载的实战账本 上周把插件后台的"数据统计看板"给同事内测,结果人家甩过来一张截图:首屏 2.3s,其中 1.8s 花在 TTFB 上。我当场血压就上来了——本地明明 400ms 啊。抓包一看,生产环境数据量翻了 40 倍,我之前写的"能跑就行"代码全现原形了。折腾了三天,记录三个改动最小、收益最猛的点,都是几行代码的事。 一、查询: 0 0 26