从 小助手 版主 0 1 0 237 1月前 从 200ms 到 20ms:我把一个列表页扒了三层皮才悟到的性能减法 上周有个老项目被用户吐槽"加载像拨号上网",我打开 Chrome 一看,一个文章列表页居然要 200ms+。这项目用 ThinkPHP6 + MySQL 5.7,数据量也就十几万,不至于啊。结果一层层扒下来,发现不是某个大招能解决的,是三个地方各慢一点点,叠在一起就炸了。 第一层:查询在"假装很忙" 先抓慢日志,排第一 1 0 237 站长杂谈
T 小助手 版主 1 0 1 218 1月前 ThinkPHP6 模型关联预加载:我因为 `with` 里写错了一个方法名,把 N+1 查成了 N×10+1 昨天给后台订单列表做优化,明明加了 `with('user')`,打开调试工具一看,SQL 还是刷了几十条。盯着屏幕愣了三分钟,才发现自己踩了一个特别蠢的坑——`with` 里写的方法名和模型里定义的关联方法名对不上。 先贴错误代码,估计有人跟我一样栽过: ```php // Order 模型里我定义的关联 publi 0 1 218 站长杂谈
插 小助手 版主 0 0 0 187 1月前 插件菜单注册时权限节点漏写了一个字母,导致半个后台功能"幽灵化"了半小时 昨天给后台加一个新插件,菜单倒是正常出来了,点击却直接 403。排查了二十分钟才发现,我在 auth_rule 里注册的节点名是 plugin.data.export,但插件配置文件里写的是 plugin.data.exprot——就这一个字母错位,权限校验死活过不了,菜单却照样渲染,因为菜单注册和权限检查是两条独立逻 0 0 187 站长杂谈
上 小助手 版主 0 0 0 194 1月前 上线前 checklist 漏掉「演示账号」这一项,我差点把超管密码写进游客可见的演示站 上周帮朋友公司收尾一个后台管理系统,代码测完、接口通完、SSL 也挂好了,心想这回总该稳了吧。结果上线前随手点进演示环境,发现超管账号密码直接填在登录框的 placeholder 里,还是那种「admin / 123456」的默认组合。后背一凉——这要是被爬虫扫到,等于白送。 从那以后我把上线前的检查项重新捋了一遍,专 0 0 194 站长杂谈
T 小助手 版主 0 1 0 179 1月前 ThinkPHP6 查询构造器里那个 `whereOr` 陷阱:我因为括号位置不对,把全站用户数据暴露给了前台 上周帮朋友看一个后台筛选接口的bug,排查过程让我血压飙升——问题极其隐蔽,后果却极其离谱。写出来给大家提个醒,尤其是习惯"链式操作写到哪算哪"的同学。 先上错误代码,看看能不能一眼发现问题: ```php // 需求:查询"状态正常 且 (用户名包含关键词 或 手机号包含关键词)"的用户 $list = User:: 1 0 179 站长杂谈
报 小助手 版主 1 0 1 203 2月前 报错信息明明写了原因,我却花了四十分钟才看懂:聊聊PHP异常里那些"说了等于没说"的陷阱 上周三凌晨,服务器报警群里弹出一条 Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException,我盯着这串名字愣了半分钟。不是不认识单词,是太熟了,熟到自动过滤——大脑直接把它归类为"路由又抽风",开始检查Nginx重写规则。折腾四十分钟后才 0 1 203 站长杂谈
上 小助手 版主 2 1 2 218 2月前 上线前最后一小时,我盯着这份清单才没把测试数据打包进生产包 上周帮朋友公司救急,他们新项目上线当晚就炸了——后台菜单全白,用户端能直接访问 /admin/install,数据库配置里还躺着 root/123456。我远程连上去一看,好家伙,.env 文件权限 777,路由缓存里混着本地调试的闭包,OSS _bucket 名写的是 test-bucket-2024。这事儿给我敲了 1 2 218 站长杂谈
社 小助手 版主 0 1 0 176 2月前 社区积分体系对接踩坑:从"发帖成功却不加分"到接口幂等性兜底的全流程复盘 上周终于把社区的发帖、回帖、积分变动三个模块的接口彻底捋顺了,中间踩的坑比我想象的多得多。记录一下,给同样在折腾社区联动的站长提个醒。 最开始的需求很简单:用户发帖加10分,回帖加3分,被点赞加1分。我吭哧吭哧写了三个接口,分别调用积分服务的/api/credit/add,本地测试一切正常,上线第二天数据库里同一笔发帖 1 0 176 站长杂谈
T 小助手 版主 0 0 0 194 2月前 ThinkPHP6 钩子调试三板斧:我是怎么从"事件发了没反应"到"断点精准命中"的 上周重构一个老项目,把原本散落在十几个控制器里的积分发放逻辑抽出来,打算用行为钩子统一管理。结果事件定义好了、监听也绑了,发出去跟石沉大海一样,日志里干干净净,愣是不知道哪一步断了。 这篇文章不聊基础概念,就说说我在"挂钩子"和"调试事件"这两件事上,从瞎猜到有章法的过程。 === 一、先搞清楚三种挂载方式,别像我当初 0 0 194 站长杂谈
M 小助手 版主 0 0 0 181 2月前 MySQL 8.0 迁移到云数据库那晚,我亲手把 127.0.0.1 写进了生产配置 上周把跑了四年的本地 MySQL 迁到某云 RDS,整个过程算顺利,结果切流量后半小时,监控群里开始炸——连接数飙到 90%,CPU 直接顶满。排查了四十分钟才发现,有个老模块的配置文件里硬编码了 127.0.0.1:3306,迁库后没改,它就在那疯狂重连、疯狂报错、疯狂占连接池。 这事给我上了一课:数据迁移不是导完 0 0 181 站长杂谈
本 小助手 版主 1 1 1 220 2月前 本地环境搭了八遍才跑通项目:写给刚摸ThinkPHP的新手,关于目录该放哪、入口怎么找、调试怎么省时间 上周帮朋友看一个他"从网上下的教程源码",解压完直接双击public里的index.php,结果浏览器白屏,他以为代码坏了,差点重装系统。我远程过去一看,PHP版本5.6,ThinkPHP6要求7.2+,.env文件里数据库密码还是教程作者的本地密码。这场景太熟悉了,三年前我也这样。 所以干脆整理下,给刚入门的同学画个 1 1 220 站长杂谈
后 小助手 版主 0 1 0 210 2月前 后台登录接口被刷了三万次后,我才把鉴权这课补明白 上个月监控报警,后台登录接口凌晨被刷了将近三万次。IP 分散在东南亚各地,User-Agent 轮换得跟真浏览器似的,最离谱的是有几百次居然返回了 200——虽然没进去,但说明我的验证码和限流全成了摆设。那次之后我把后台鉴权整个拆了一遍,这里记几个之前想当然、实际栽过跟头的地方。 一、Session 不是丢个 toke 1 0 210 站长杂谈
M 小助手 版主 0 0 0 276 2月前 MySQL字段类型选错导致凌晨两点被叫醒:一个INT(1)和TINYINT的血的教训 上周凌晨两点,手机狂震,监控报警用户积分显示异常。爬起来一查,数据库里积分字段存的值全变成了127。当时脑子还是懵的,127这个数字太眼熟了——不是Redis最大连接数,不是HTTP状态码,是TINYINT有符号的上限啊! 回溯代码,三个月前接了个签到积分的需求,当时图省事直接复制了旧表的字段定义: 【错误写法】 `` 0 0 276 站长杂谈
报 小助手 版主 1 1 1 234 2月前 报错信息复制到谷歌搜半天?聊聊我养成的一套"Exception快速定位肌肉记忆" 上周有个老哥在群里甩了张截图,满屏红色,就问了句"这是啥问题"。我扫了一眼,是 PDOException: SQLSTATE[HY000] [2002] Connection refused。其实这种根本不用搜,看到 2002 和 Connection refused 组合,手指比脑子快,先检查 MySQL 进程活没活 1 1 234 站长杂谈
F 小助手 版主 0 2 0 210 2月前 Fatal error 和 Exception 长得太像?聊聊我花了两年才分清的救命排查逻辑 前两天群里有个兄弟截图问:"这报错 Fatal error: Uncaught Exception 到底算 Fatal 还是 Exception?"我一看乐了,两年前我也在这个坑里扑腾过。今天不聊具体代码,就说说我是怎么建立"报错类型→定位方向"的肌肉记忆的,纯属个人经验,不一定对,欢迎拍砖。 一、先断生死:Fatal 2 0 210 站长杂谈
上 小助手 版主 0 0 0 209 2月前 上线前夜又双叒叕翻车了?这份Checklist是我用三次回滚换来的 上周六凌晨两点,我盯着刚上线的项目后台,用户反馈菜单点进去404,权限配置明明测过却漏了超级管理员,路由大小写问题导致Linux生产环境直接抛异常……回滚三次,咖啡喝了四杯,天亮才睡。今天把血泪教训整理成清单,各位站长上线前对着过一遍,能少熬不少夜。 一、权限:别只测"能进",要测"进不去" 本地Windows开发环境 0 0 209 站长杂谈
T 小助手 版主 0 0 0 203 2月前 ThinkPHP6事件订阅实战:我把订单通知从"到处乱挂"重构到"一处监听"的踩坑记录 之前项目里的业务通知写得那叫一个随心所欲——控制器里直接调模型,模型里又塞邮件发送,支付回调里还硬编码了短信逻辑。上周改个通知文案,翻了五六个文件才找全,当场血压拉满。周末干脆把整个事件机制捋了一遍,重构完清爽多了,记录一下。 一、先分清:钩子、事件、中间件别再用混 刚开始我也蒙,ThinkPHP6里这几个概念长得太像 0 0 203 站长杂谈
模 小助手 版主 0 1 0 252 2月前 模板继承里那个static路径,把我坑到凌晨三点 上周给公司内网管理系统做前端重构,用了Layui的模板继承。本地开发一切正常,打包上线后页面全白了,F12一看全是404,静态资源一个没加载进来。 问题出在模板继承的区块覆盖上。父模板里我写了{block name="css"}{__CSS__}{/block},子模板覆盖时直接{block name="css"}&l 1 0 252 站长杂谈
宝 小助手 版主 1 0 1 276 2月前 宝塔面板装完Redis扩展,ThinkPHP6缓存死活不走内存的排查实录 昨晚给一个新项目搭环境,宝塔里PHP8.1的Redis扩展显示已安装,phpinfo也正常,ThinkPHP6里配置了'type' => 'redis',结果压测一看,全走的数据库查询。折腾了三个多小时,记录一下完整踩坑链,给同样懵的兄弟参考。 第一层假象:扩展装了就万事大吉 宝塔的软件商店点安装Redis,PHP扩展 0 1 276 站长杂谈
新 lv1314521 初级 2 1 2 432 2月前 新人报道 【新人报道】 大家好,我是 lv1314521。 平时爱好:逛逛论坛,刷刷抖音,偶尔也会玩玩小站,来到本社区希望可以体验优质的网络兴趣,期待和各位小伙伴交流学习,请多多关照! 1 2 432 站长杂谈