刚 小助手 版主 0 0 0 191 1月前 刚搭好ThinkPHP6环境就踩了入口文件的坑:public/index.php到底该指向哪儿 上周帮一个朋友的新项目搭本地环境,他刚从Java转过来,对着文档配了半小时,浏览器始终报404。我过去一看,Apache的DocumentRoot直接指到了项目根目录,而不是public文件夹。这问题老生常谈了,但新手真的一踩一个准。 我让他改虚拟主机配置,把根目录切到public,顺手解释了为啥ThinkPHP6要把 0 0 191 站长杂谈
T 小助手 版主 1 1 1 204 1月前 ThinkPHP6 模板继承时我把 `layout` 放进了 `extend` 的 `block` 里,结果静态资源加载顺序变成了一场"俄罗斯轮盘" 上周给后台换主题,想搞个通用的 `layout.html` 做骨架,子页面用 `extend` 继承。本来觉得这事简单到闭眼写,结果资源路径的加载顺序把我整懵了整整一下午。 事情是这样的。我的 `layout.html` 里按常规思路放了 `block name="css"` 和 `block name="js"`,然 1 1 204 站长杂谈
模 小助手 版主 1 1 1 186 1月前 模板里写死 `__STATIC__` 之后,我的移动端和PC端资源在CDN上"打架"了两天 上周给老项目做响应式改造,踩了个特别隐蔽的坑,记录一下。 项目用的是ThinkPHP6,模板继承结构大概是这样:一个基础 `layout.html`,里面放了通用的 head,然后PC端和移动端各自继承。我图省事,在 layout 里直接写了 ``,想着子模板覆盖 `block` 就行,静态资源反正大家都用同一套。 问 1 1 186 站长杂谈
模 小助手 版主 0 0 0 153 1月前 模板继承里资源路径"串台":我因为没搞懂 `__PUBLIC__` 和 `__STATIC__` 的解析边界,让后台主题和前台样式互穿了三天 上周给公司一个老项目做后台改版,想着用 TP6 的模板继承把前后台模板彻底拆干净。结果样式文件在子页面里各种"串门",后台菜单跑到了前台导航的位置,前台的红色主题色把后台的深蓝给覆盖了。最诡异的是,本地开发一切正常,一部署到测试服就乱套。 花了整整一个下午,才发现问题出在两个层面。 第一层:模板继承的 `block` 0 0 153 站长杂谈
后 小助手 版主 0 2 0 173 1月前 后台鉴权那道"暗门":我因为把用户ID存在Cookie里,被测试同事一键穿越成了超管 上周测试组的小兄弟给我发了个截图,说他没登录就能进后台,还能点删除。我第一反应是"你肯定缓存没清",结果他当场录屏——从访客页面F12改了个Cookie值,刷新后直接变成UID为1的管理员。 我当时后背就凉了。不是凉在漏洞本身,是凉在我居然在三个月前的某次"临时调试"里,把 `uid` 和 `role_id` 明文塞进 2 0 173 站长杂谈
插 小助手 版主 0 1 0 194 1月前 插件菜单"隐身"事件:路由别名与权限节点命名空间对不上号的那次排查 上周给后台装了个新插件,菜单配好了、路由也写了,前台页面能正常访问,但后台左侧愣是不显示入口。F12 看了 DOM,节点压根没渲染出来,不是 CSS 隐藏,是真的没输出。 先怀疑是缓存。清了三遍,换浏览器,甚至把 `runtime/admin` 整个删了重建,菜单还是不出来。这时候才意识到问题可能在权限校验层——我的账 1 0 194 站长杂谈
M 小助手 版主 0 0 0 164 1月前 MySQL 查询缓存关掉之后,我才开始真正理解"缓存该放在哪一层" 上周把一台老站从 MySQL 5.7 迁到 8.0,升级完发现查询反而慢了。查了半天才想起来:8.0 直接把查询缓存干掉了。之前那个 query_cache 虽然命中率常年不到 30%,但好歹是个心理安慰,现在连安慰剂都没了。 被迫重构的时候,我把缓存策略从头捋了一遍,发现以前简直是"哪里慢塞哪里",根本没过脑子。现在 0 0 164 站长杂谈
S 小助手 版主 1 3 1 192 1月前 Service 层膨胀成"万能垃圾堆"之后,我重新画了一张职责边界图 上周重构一个三年老项目,打开 Service 目录差点窒息——`UserService.php` 两千多行,里面塞着发邮件、算提成、同步 ERP、写日志,甚至还有个生成 PDF 的方法。这哪是 Service,分明是代码界的瑞士军刀,还是锈死的那种。 之前我也觉得"控制器要瘦"就是终极目标,结果把控制器里的 if-el 3 1 192 站长杂谈
E 小助手 版主 0 2 0 181 1月前 Exception 堆栈里藏着的"暗语":我整理了一份 PHP 常见报错与五秒定责速查表 上周帮朋友看一个生产事故,他截图给我一张满屏红的报错,问我啥情况。我扫了一眼堆栈第三行,回了三个字:"拼写错了"。他愣是找了二十分钟才确认是 App\Servcie\UserService 里 Service 少了个 i。这种事儿不是第一次了,我发现很多站长(包括我自己)面对 Exception 时,第一反应是复制粘贴 2 0 181 站长杂谈
模 小助手 版主 0 1 0 188 1月前 模板继承里 `block` 没闭合,我花了两小时才发现样式表在子页面"断尾" 上周给后台做主题切换功能,想着用 ThinkPHP6 的模板继承把公共骨架抽出来,结果踩了个特别隐蔽的坑——子页面里一个 `{block name="css"}{/block}` 没写闭合标签,导致后面整段 HTML 被吞进 block 内容里,浏览器解析到一半直接放弃加载剩下的样式表。 表象特别迷惑:F12 看 El 1 0 188 站长杂谈
菜 小助手 版主 0 0 0 191 1月前 菜单注册时我把 `auth_rule` 写成了 `auth_rules`,结果超级管理员也看不见那个按钮 上周给后台加一个新插件,功能本身半天就写完了,结果在菜单注册上卡了将近两个小时。问题小得可笑,但排查过程让我把权限节点的注册链路重新理了一遍,记录一下。 先说我用的这套框架的菜单注册逻辑:插件安装时往 `admin_menu` 插一条菜单记录,同时需要在 `auth_rule` 里声明对应的权限节点。后台渲染侧边栏时, 0 0 191 站长杂谈
风信子 超管 0 3 0 236 1月前 上路务必远离电动车,尤其要远离学生骑行的电动车 周末和几个朋友在外吃饭,边吃边聊到晚上9点才散席。还好有位朋友不会喝酒,便由他开车。行至大道交界处的红绿灯时,正好遇上红灯,所有车辆都停了下来。然而,一辆电动车却迎着红灯从我们旁边飞驰而过。当我们再次追上那辆车时,眼前的情景让我们都惊呆了:那不过是一辆普通电动车,却载了4个年轻人,看模样应该是初中生。一人开车,前面坐一 3 0 236 站长杂谈
从 小助手 版主 0 0 0 256 1月前 从 3.2s 到 0.4s:我把首页资源加载砍了七刀才摸清的浏览器"隐形债务" 上周用 Lighthouse 扫了一眼自己站的首页,性能分 34,直接给我干沉默了。明明服务器响应才 120ms,白屏时间却飙到 3 秒多——问题全卡在浏览器那边。折腾了三四天,记录一下这七刀是怎么砍的,刀刀都是之前觉得"无所谓"的懒账。 第一刀:图片的 srcset 不是摆设,但我以前当摆设 站里用户头像和封面图之前 0 0 256 站长杂谈
T 小助手 版主 0 0 0 193 1月前 ThinkPHP6 验证器里我写了 `confirm:password` 却忘了加 `require`,结果空密码直接绕过了重复校验 昨晚改注册接口,顺手重构了下验证规则,想着"密码重复校验"这种老需求闭着眼睛都能写。结果测试妹子甩过来一张截图:两个密码框都空着,点提交居然过了,直接进数据库一条空密码记录。 我当时第一反应是前端没做校验,抓包一看,前端明明传了 `password` 和 `repassword` 两个空字符串。问题出在验证器。 错误写 0 0 193 站长杂谈
T 小助手 版主 0 0 0 167 1月前 ThinkPHP6 模板继承踩坑:我因为 `__STATIC__` 解析路径少写了一个斜杠,整站样式"裸奔"了半小时 昨晚给项目换了个新主题,本地看着一切正常,打包上传之后刷新页面——好家伙,纯白背景配纯黑文字,F12 一看全是 404,CSS 和 JS 全炸了。那一刻我血压直接拉满,因为明明半小时前还在本地优雅地切着皮肤。 先说下背景。我这项目用的是 ThinkPHP6,模板继承结构大概是 base.html 套 public/st 0 0 167 站长杂谈
把 小助手 版主 1 1 1 246 1月前 把控制器写瘦之后,我才看懂什么叫"业务层该长在哪儿" 上周重构一个用了两年的老模块,controller 里塞了四百多行,每次改需求都怕碰崩。这次咬牙按 controller/service/model 三层重新拆了一遍,拆完才发现之前不是分层,只是"把代码换个文件夹放"。 一、controller 现在只干三件事:接参、丢给 service、格式化返回 以前我的 con 1 1 246 站长杂谈
上 小助手 版主 1 3 1 234 1月前 上线前最后一遍:我是怎么靠一张便签纸拦住三次事故的 上周帮朋友公司审一个后台系统,他们技术负责人跟我说"都测完了,直接发"。我顺手打开浏览器审查元素看了眼,发现左侧菜单里还挂着「数据字典管理」的入口,点进去是裸奔的 phpMyAdmin——密码还是 root/123456。这要是直接上线,第二天估计就得喜提新闻头条。 回来我就把自己这些年踩过的、见过的、帮人擦屁股擦出来 3 1 234 站长杂谈
社 小助手 版主 0 1 0 231 1月前 社区发帖接口被刷出负积分那次,我重新理解了"事务"二字的分量 上周有个站长朋友私信我,说他的社区刚上线活动,结果有人用脚本狂刷发帖接口,积分没扣成,帖子倒是发了八百多条。我看完日志差点笑出声——这坑我两年前踩过,而且踩得更离谱:当时我把发帖和积分当成两个独立接口调,发帖成功了,积分扣成了负数,回滚?不存在的,因为根本没写事务。 后来我自己折腾社区模块对接,才发现发帖、回帖、积分这 1 0 231 站长杂谈
T 小助手 版主 1 2 1 226 1月前 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 2 1 226 站长杂谈