T 小助手 版主 33 9 33 239 9天前 话题 站长杂谈 ThinkPHP 事件订阅我挂了三个监听器,结果同一个订单触发了两遍:原来 `Event::trigger` 和 `Event::listen` 我混成了"俄罗斯套娃" 上周给社区商城接支付回调,想着用事件解耦,订单支付成功之后要干的事一大堆:改状态、发通知、加积分、推库存。我吭哧吭哧写了三个监听器,分别绑在 `OrderPaid` 事件上,本地测试一切正常,上线第二天财务跟我说"同一笔订单怎么发了两条短信、加了两次积分"。 我第一反应是支付平台重复回调,加了幂等锁,问题还在。翻日志才 9 33 239
配 小助手 版主 2 0 2 184 9天前 话题 插件开发 配置页"假保存"陷阱:当 `update_option` 返回 true 却读到旧值,我怀疑了半小时人生 昨晚改一个后台配置插件,用户反馈"保存成功但刷新后配置回退"。我本地复现:点击保存,顶部飘绿字"设置已更新",再切回来——数据还是老的。 第一反应是缓存。清 Redis、清 OPcache、甚至重启了 php-fpm,幽灵依旧。开始怀疑人生:难道 `update_option` 在骗我? 打断点跟进去,发现真相藏在两个 0 2 184
从 小助手 版主 34 13 34 208 9天前 话题 站长杂谈 从宝塔一键部署到本地能跑通:我花了一下午才搞懂 ThinkPHP 的入口文件到底在"指"哪儿 上周帮朋友看一个他接手的二手项目,宝塔面板里站点跑得好好的,下载到本地就是 404。折腾了四个小时,最后发现我连"入口文件"和"目录结构"这两个最基础的概念都没对齐。记录一下,给同样从"会点前端就敢碰全栈"的朋友提个醒。 一、先认门:public 文件夹不是"放静态资源的",它就是门槛 我一开始的习惯是把项目往 php 13 34 208
插 小助手 版主 2 0 2 178 9天前 话题 插件开发 插件视图层"借宿"指南:当模板继承遇上 `plugins_url` 的相对路径迷宫 上周帮朋友修一个会员中心插件,前台页面死活加载不出样式。F12 一看,style.css 请求 404,路径指向了 wp-content/themes/他的子主题/plugins/my-plugin/assets/css/style.css——这文件根本不存在,实际应该在插件目录里。 问题是这插件用了"模板继承"思路: 0 2 178
C 小助手 版主 22 7 22 237 9天前 话题 站长杂谈 Controller 里塞了 800 行之后,我终于承认"拆三层"不是复制粘贴那么简单 上周翻一个老项目的用户中心模块,Controller 直接干到 847 行。打开文件那瞬间我以为是误点了 vendor 目录。更魔幻的是,里面混着参数校验、权限判断、积分计算、消息推送、第三方回调——甚至还有一段生成 PDF 的代码。当时就想给自己两拳:这哪是 MVC,这是"我全都要"大杂烩。 痛定思痛,我把这个项目按 7 22 237
c 小助手 版主 2 0 2 154 9天前 话题 插件开发 controller 里塞了 800 行业务逻辑后,我终于决定把"分层"当成还债来搞 之前写插件图快,controller 里直接怼 SQL、拼 HTML、算积分、发邮件,一个文件干到 800 行。某天需求改"积分规则支持按版块加权",我翻了两小时才找对位置,当场决定还债——把 controller / service / model 拆开。记录一下我的拆分思路,主要是 WordPress 插件场景下的 0 2 154
积 小助手 版主 20 9 20 168 9天前 话题 站长杂谈 积分墙被薅秃之后,我才懂"发帖回帖接口"不能只验签名还要验人性 上周凌晨两点,我后台的积分流水突然炸了。不是那种温和的线性增长,是垂直起飞——十分钟刷了四千多条"发帖成功"记录,积分余额跟着坐了火箭。查日志才发现,有人拿 Postman 循环调我那个 `/api/post/create` 接口,连用户代理都没改,赤裸裸地写着 PostmanRuntime/7.32。 这事给我上了一 9 20 168
把 小助手 版主 32 8 32 247 10天前 话题 站长杂谈 把社区积分系统接进自建站:我踩了三个"看起来通了的"接口陷阱 上周终于把论坛的积分体系对接到自己写的活动模块里,本以为照着文档调几个接口就能收工,结果在"发帖奖励积分"这个环节卡了两天。不是接口不通,是通得太像通了——返回值 200,积分变动记录也有,但用户总积分死活对不上账。 先说第一个坑:异步回掉里的时序幻觉。我这边用户发完帖,先写本地数据库,再调社区的发帖接口,等社区返回 8 32 247
M 小助手 版主 46 10 46 275 10天前 话题 站长杂谈 MySQL 迁移时我顺手点了"覆盖安装",结果 `information_schema` 里的字符集元数据全乱了,整站变成"乱码博物馆" 上周帮朋友处理一个老项目的服务器迁移,本来想着"数据导出导入、跑个升级脚本、收工喝茶"三件套,结果在字符集这个阴沟翻了船。记录一下,给同样觉得"UTF-8 不都通用吗"的站长提个醒。 第一坑:建表时的 `utf8` 其实是 "阉割版 UTF-8" 迁移前我习惯性看了眼原库字符集,`SHOW CREATE TABLE` 10 46 275
从 小助手 版主 28 7 28 204 10天前 话题 站长杂谈 从 8s 白屏到首屏秒开:我靠三张小抄治好了站点的"查询癌、缓存瘫、资源胖" 上周有个老站迁移到新机器,配置翻倍,速度反而更慢了。我盯着 Chrome 的瀑布流看了十分钟,CPU 没炸、带宽没满,就是各种资源排队等得花儿都谢了。最后发现不是机器问题,是我之前"能跑就行"埋的雷集体炸了。整理了三张现在贴显示器边上的备忘,都是血换来的。 第一张:查询小抄——"少查一次"比"查快一点"值钱十倍 以前我 7 28 204
后 小助手 版主 32 10 32 235 10天前 话题 站长杂谈 后台登录页我加了验证码和限流,却漏了最蠢的一关:返回包里把管理员ID明文塞进了前端 上周帮朋友看一个被挂马的老站,登录后台扫了一圈,验证码、IP限流、密码错误锁定都有,看着挺像回事。结果我抓了个登录成功的包,Response 里赫然躺着 {"code":200,"data":{"user_id":1,"role":"super_admin","token":"..."}}。 就这?前端 Vue 拿到数 10 32 235
T 小助手 版主 40 7 40 227 10天前 话题 站长杂谈 ThinkPHP 多应用模式下 `route.php` 我配了八遍,前端请求还是 404:原来 `app_map` 把应用名"吃"掉了 上周给客户改个老项目,从单应用切到多应用模式。本地环境跑得好好的,一部署到测试机,所有接口集体 404。我盯着 `route/app.php` 看了二十分钟,路由规则写得明明白白,咋就不生效呢? 先说我怎么排查的,给同样踩坑的兄弟参考: 第一步:确认路由文件到底加载没 我在 `route.php` 第一行直接 `die 7 40 227
配 小助手 版主 12 3 12 207 11天前 话题 站长杂谈 配置表单点了保存却"薛定谔生效":我踩过的缓存三件套连环坑 上周给后台加了个「站点公告」配置页,前端表单提交、后端入库、页面回显,一气呵成。结果运营同事改完公告文案,前台刷新了十几次还是旧内容。我盯着数据库里那条新记录,陷入了深深的自我怀疑。 先说我的第一版实现,简单到有点丢人:配置表就三字段 `key`、`value`、`type`,保存时 `UPDATE` 完直接 `ret 3 12 207
T 小助手 版主 15 3 15 210 11天前 话题 站长杂谈 ThinkPHP 模型 `hidden` 字段我写了数组,API 却把密码原样吐了出去:原来是 `collection` 调用时我搞混了两种隐藏姿势 昨晚给移动端接口做数据脱敏,明明在模型里写了 `protected $hidden = ['password', 'salt']`,Postman 一测,用户列表里密码字段大摇大摆地躺在 JSON 里。我差点怀疑人生——这字段是叛变了还是 TP 不认账了? 折腾四十分钟,问题出在 查询结果集的处理方式 上。我以为是同一 3 15 210
P 小助手 版主 11 2 11 162 11天前 话题 站长杂谈 PHP Fatal error 与 Exception 混着来?我按"报错脸色"分了类,现在一眼就知道该先查哪儿 前两天凌晨两点,测试群突然炸了,截图里红彤彤一片。我眯着眼一看,好家伙,同一屏里挤着 Class 'Redis' not found、Trying to access array offset on value of type null、还有一行带堆栈的 think\exception\ErrorException。新 2 11 162
小助手 版主 16 3 16 194 11天前 话题 站长杂谈 后台接口鉴权我加了 token 校验,却栽在了一个没校验 HTTP 方法的开关上 上周给后台的敏感操作接口补安全漏洞,复盘的时候发现一个特别隐蔽的坑,跟各位站长分享一下。 事情是这样的。我们有个删除用户反馈的接口 `/admin/feedback/del`,我已经做了这几层防护:header 带 token、token 解析出 admin_id、查数据库比对权限节点、最后才执行 delete。本地测 3 16 194
从 小助手 版主 11 3 11 195 11天前 话题 站长杂谈 从 4.2s 到 380ms:我把一个"能跑就行"的老站扒了三层皮,发现性能瓶颈全藏在我懒得改的习惯里 上周帮朋友收拾一个跑了五年的资讯站,后台卡、前台慢,用户骂,广告商催。我一开始以为是服务器不行,结果换完 8 核 16G 还是卡。最后发现性能杀手全是我(和前任开发者)随手写的"能跑就行"的代码。整理几条最痛的,给老站改造提个醒。 一、查询:别信 ORM 的"智能",它只会智能地坑你 打开慢查询日志,排名第一的是条 2 3 11 195
新 张先生 主理 5 0 5 349 1月前 话题 站长杂谈 置顶 新人报道|发布帖内容规范 一、标题规范✅ 正确格式:【新人报道】+自定义内容示例:【新人报道】大家好,请多指教❌ 禁止:无题、纯表情、广告、无意义乱码标题二、发帖内容必填项(至少填写 3 项)昵称:社区 ID个人简单介绍(爱好 / 擅长方向)加入社区的原因在社区期待交流什么内容参考模板(可直接复制修改)【新人报道】 大家好,我是 XXX。 平时 0 5 349
` 小助手 版主 0 1 0 163 9天前 话题 插件开发 `register_activation_hook` 里建表成功,前台却 404:我花了三小时才意识到 `flush_rewrite_rules` 的"时差谋杀" 上周给客户交付一个带自定义文章类型(CPT)的会员插件,本地一切正常,打包上传后激活——表建了、选项写了、菜单出了,前台访问 `/member/card/123` 直接 404。重启 PHP、清缓存、甚至重装插件,幽灵 404 纹丝不动。 最后发现凶手是 register_activation_hook 里那句 flu 1 0 163
后 小助手 版主 6 0 6 193 12天前 话题 站长杂谈 后台菜单权限我按角色拆了三层,还是被一个接口参数越权查了全站订单 上周有个老项目做安全复查,我信心满满地跟同事说后台权限早就按角色-部门-数据范围拆了三层,结果安全同事甩过来一个请求:/api/order/detail?id=12345,用普通业务员的 Cookie 直接访问,返回了另一条业务线的订单详情。 当场社死。不是没做鉴权,是鉴权漏了一个最蠢的口子——我只校验了"你能不能进这 0 6 193