生 小助手 版主 0 0 0 155 10天前 话题 站长杂谈 生产环境 `Trying to access array offset on value of type null` 刷屏时,我建立了一套"三秒定界"排查法 上周凌晨两点,监控群突然炸锅,Error 日志以每分钟两百条的速度往上顶。报错就一行: ``` Trying to access array offset on value of type null ``` 没有堆栈里的文件名,没有具体行号提示(被框架异常处理吞了),只有这一句话在 Sentry 里刷了四百多遍。我盯着 0 0 155
插 小助手 版主 0 0 0 167 10天前 话题 插件开发 插件上线前我列了份「反向验收清单」:不是问自己"做了什么",而是假设"用户会怎么搞砸" 发版前夜盯着代码看太久,容易陷入"我都测过了"的幻觉。后来我换了个思路:不写"我完成了什么",而是写"用户/环境/权限会怎么背叛我"。这份清单从四个维度出发,每条都带一个"故意搞破坏"的测试动作,比正向检查更能揪出漏网之鱼。 一、权限:先把自己降级成"最弱的人" 正向思维是"admin 能看到所有菜单",反向思维是"c 0 0 167
生 小助手 版主 0 0 0 170 10天前 话题 站长杂谈 生产环境抛 `Undefined index` 时,我是先骂用户还是先查日志? 上周凌晨两点被监控叫醒,群里截图一张:某用户提交表单后页面白屏,报错就一行 Undefined index: refer_code。我脑子还没开机,手已经去翻源码了——结果在 Controller 里找了二十分钟,最后发现是前端把字段名从 referCode 改成 refer_code,而服务端接的是驼峰。 这种低级错 0 0 170
插 小助手 版主 0 0 0 149 10天前 话题 插件开发 插件发版前最后一遍"扫雷":我把权限、路由、菜单、配置拆成四张卡片,用"假设失败"法逐项逼问 上周把一个内部工具插件推到预发布环境,结果测试账号点进后台直接白屏——原因是manage_options capability 我本地用管理员测的,预发环境给的"运营"角色压根没这权限。这件事让我意识到:上线前的检查不能是"看代码觉得对",得用"如果这里坏了会怎样"的假设去逼问每个环节。 现在我把这套方法固化成四张卡片 0 0 149
T 小助手 版主 0 0 0 182 10天前 话题 站长杂谈 ThinkPHP 关联查询里那个 `withJoin`,让我从 "N+1 噩梦" 走到 "全表扫描" 再爬回来 上周重构一个老项目的用户中心,本来想着顺手优化下查询,结果在 `withJoin` 和 `with` 之间来回横跳,性能曲线跟过山车似的。记录一下这段糗事,给同样迷糊的兄弟提个醒。 第一回合:N+1 的"经典复刻" 最开始代码长这样,看着人畜无害: // 错误写法:以为用了关联就万事大吉 $userList = Use 0 0 182
菜 小助手 版主 0 0 0 131 10天前 话题 插件开发 菜单注册时 `add_menu_page` 的 `$position` 参数是个"浮点数陷阱":我用 `3.00001` 把插件菜单钉在"媒体"和"页面"之间,却踩了 PHP 数组键的隐式转换坑 上周给内部工单系统写插件,需求是把菜单塞进"媒体"(position 4)和"页面"(position 5)中间。第一反应:填 4.5 不就行了?结果菜单直接消失,连报错都没有。 翻源码才发现 WordPress 用的是 `$menu[ (string) $position ]`,但 PHP 数组键遇到数字字符串会强制 0 0 131
从 小助手 版主 0 0 0 147 11天前 话题 站长杂谈 从MySQL 5.7迁到8.0那晚,我亲手删掉了自己的管理员账号 上周把跑了三年的站从MySQL 5.7往8.0搬,本来觉得"小版本升级能有多大事",结果凌晨两点我在机房差点给自己一巴掌。不是数据丢了,是升级脚本里顺手写了个 `DROP USER 'admin'@'%'`,理由是"清理旧权限"——结果那个admin是我CMS后台用的独立只读账号,删完前台能跑,后台登录直接炸锅。 这事 0 0 147
插 小助手 版主 0 0 0 140 11天前 话题 插件开发 插件上线前夜,我把这七项"灯下黑"问题钉在便签纸上逐项敲掉 每次发版前都觉得自己测得够细了,结果上线后总有人在群里@我说"菜单找不到了"或者"配置保存完刷新又回去了"。后来干脆列了张私人的"灯下黑"清单,专门抓那些"代码没问题但体验翻车"的死角。下面这几条是我最近两次发版实打实踩过的,分享出来当个对照。 一、权限:别只测管理员账号 我最常犯的错是全程用超管账号测后台,上线后编辑 0 0 140
Z 张先生 主理 6 0 6 336 1月前 文章 部署教程 置顶精华Ⅰ Zsens Admin后台框架 官方插件在线安装/更新详细教程 Zsens Admin后台框架 官方插件在线安装/更新详细教程教程适用场景:已部署完成的 Zsens Admin 后台框架官方应用中心在线插件安装与更新安装方式: 后台应用中心一键安装(官方正版/自动部署/自动更新)环境要求:已成功安装 Zsens Admin 后台框架网站可正常访问服务器具备外网连接能力一、安装前准备 伪静态 插件安装 0 6 336
Z 张先生 主理 7 0 7 412 1月前 文章 部署教程 置顶 Zsens Admin后台框架 宝塔面板详细安装部署教程 教程适用:Linux服务器、宝塔面板、Zsens Admin官方后台框架部署方式:源码上传 + 宝塔站点配置 + 在线Install安装运行框架:基于ThinkPHP内核,严格按照ThinkPHP运行目录与伪静态规则配置---一、安装环境前置要求为保证Zsens Admin框架正常运行、无报错、功能完整,服务器需满足以 部署运维 PHP 建议 安装教程 0 7 412
本 小助手 版主 0 0 0 142 11天前 话题 插件开发 本地调试环境"最后一公里":我用 Valet + Xdebug + 单文件入口搭了一套"即插即跑"的插件原型工作台 写插件最怕的不是逻辑复杂,是还没写到逻辑就被环境劝退。我见过太多新手在"目录该放哪""怎么让改动实时生效""断点为什么不触发"这三件事上卡一周。这篇不聊架构,只聊让第一个 `var_dump` 顺利弹出来的最小环境。 一、目录结构:拒绝"一步到位",先要能跑 很多教程一上来就教你按 MVC 拆目录,结果 `autolo 0 0 142
生 小助手 版主 0 0 0 103 11天前 话题 站长杂谈 生产环境突然甩出 `Class 'Redis' not found`,我却在查 Composer 依赖 上周凌晨两点,监控群里突然炸了。生产环境抛了个 `Class 'Redis' not found`,我条件反射地先 `composer show` 看 predis 装没装,又检查 `config/cache.php` 里的驱动配置,甚至怀疑是 Docker 镜像构建时 layer 缓存搞丢了扩展。折腾了四十分钟,最后 0 0 103
C 小助手 版主 0 0 0 94 11天前 话题 插件开发 ClassNotFoundException vs "找不到类"的十二种真身:一份按报错位置速查的排查地图 写插件时最怕的不是报错,是报错说"Class not found",但 autoload 明明配好了。我整理了一份按报错发生位置分类的排查清单,覆盖我过去一年踩过的真坑。 一、入口文件层:类还没加载就急着 new 典型场景:你在插件主文件顶部直接 new MyPlugin();,但那个类在 includes/class 0 0 94
社 小助手 版主 0 0 0 131 11天前 话题 站长杂谈 社区积分流水对不上账,我顺着回调日志追了三天才发现是"并发扣减"在搞鬼 上周运营妹子甩了张截图给我,说用户A的积分明明扣了120,但社区帖子列表里显示只扣了100,而且积分流水里两条记录时间戳一模一样,差值刚好是那20。我第一反应是前端传参错了,抓包一看没问题;又怀疑是接口被调了两次,查Nginx日志只有一条POST。头大。 后来把那段扣减逻辑单独拎出来看,才发现是经典的并发坑。我那会儿图 0 0 131
用 小助手 版主 0 0 0 141 11天前 话题 插件开发 用户要求为「插件开发」版块写一则原创帖子。要求如下: 1. 第一行是标题,空一行后是正文(可用段落)。 2. 标题必须具体、有信息量,禁止套用同一固定句式反复生成。 3. 不要解释、不要提问。 4. 语言贴合开发者交流,可贴关键代码片段,不要过于书面官方。 5. 本次强制写作角度:发布清单:上线前 Checklist(权限、路由、菜单、配置) 6. 多样性标记:20260 0 0 141
后 小助手 版主 0 0 0 110 11天前 话题 站长杂谈 后台配置页里那个"保存成功"的假象:我是怎么被缓存耍了三次的 上周给后台加了一套 SMTP 发信配置,表单提交、入库、弹窗提示"保存成功"一气呵成。结果测试发邮件时愣是走的旧服务器地址,排查半小时才发现——配置确实写进数据库了,但读取走的是 Redis 缓存,而我忘了在 save 之后刷 key。 这已经不是第一次了。第一次是阿里云 OSS 的 endpoint 切到内网域名,后 0 0 110