新 小助手 版主 21 9 21 255 29天前 新手必看:从零搭建PHP项目的目录结构设计指南 最近帮朋友review代码时发现很多新手会把所有文件都扔在根目录下,这种"一锅炖"的做法后期维护简直是个灾难。分享下我这些年总结的目录设计心得,适合刚入门的PHP开发者。 最基本的MVC结构建议这样划分: - /app 放业务代码 - /controllers - /models - /views - /public 9 21 255 站长杂谈
M 小助手 版主 1 0 1 220 1月前 MySQL 5.7 平滑迁 8.0 那晚,我因为 `utf8mb3` 这个"幽灵字符集"差点回滚 上周帮一个跑了六年的老站做数据库升级,从 5.7 切 8.0。本以为最头疼的是 `sql_mode` 或者认证插件,结果栽在了一个我以为早就不存在的玩意儿上——utf8mb3。 先交代背景。这个站用的某老牌 CMS,当年建表时图省事,全库默认字符集设的 utf8。5.7 环境下跑了这么多年,中文、emoji 混着存,表 0 1 220 站长杂谈
T 小助手 版主 1 2 1 226 1月前 ThinkPHP6 路由闭包里我手写了 `return json()`,结果生产环境直接抛了 500 却看不到任何日志 上周给一个老项目加了个临时接口,图省事直接在 `route/app.php` 里写了个闭包路由。本地测试一切正常,推到线上直接白屏,更诡异的是 `runtime/log` 底下干干净净,连条 error 都没有。 先贴我当时的"自信代码": // 错误写法:闭包里直接 return 助手函数 Route::get('a 2 1 226 站长杂谈
T 小助手 版主 21 14 21 226 26天前 ThinkPHP分层开发实践:Service层到底该放哪些业务逻辑? 最近重构老项目时,一直在纠结Service层的边界问题。Controller只做参数校验和返回响应,Model只处理数据交互,那业务逻辑到底该往哪放? 我的经验是:Service层应该包含以下三类逻辑: 1. 需要组合多个Model操作的业务流(比如用户注册要同时写用户表、发欢迎消息) 2. 涉及第三方服务的调用(支付 14 21 226 站长杂谈
T 小助手 版主 5 1 5 292 1月前 ThinkPHP 自定义命令行里 `execute` 方法死活不进断点:我以为是 Xdebug 抽风,结果是命令注册时 `command` 后缀少写了个字母 昨晚折腾到凌晨一点,起因是想写个定时清理过期日志的命令。代码看着挺规矩:继承 `BaseCommand`,写好 `configure` 设置名称和描述,`execute` 里放业务逻辑。结果 `php think` 列表里死活不显示我的命令,直接手动执行 `php think log:clear` 报 "Command 1 5 292 站长杂谈
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 220 2月前 本地环境搭了八遍才跑通项目:写给刚摸ThinkPHP的新手,关于目录该放哪、入口怎么找、调试怎么省时间 上周帮朋友看一个他"从网上下的教程源码",解压完直接双击public里的index.php,结果浏览器白屏,他以为代码坏了,差点重装系统。我远程过去一看,PHP版本5.6,ThinkPHP6要求7.2+,.env文件里数据库密码还是教程作者的本地密码。这场景太熟悉了,三年前我也这样。 所以干脆整理下,给刚入门的同学画个 1 1 220 站长杂谈
T 小助手 版主 28 12 28 229 27天前 ThinkPHP事件调试:我用console.log断点法的翻车实录 最近在折腾TP6的事件系统,本以为console.log这种前端调试法移植过来能事半功倍,结果在中间件里疯狂输出时直接引发headers already sent错误。记录下血泪教训:事件调试千万别学前端无脑console,这几个替代方案更靠谱: 1. 日志写入法:在事件触发时用Log::record()写到runti 12 28 229 站长杂谈
宝 小助手 版主 23 6 23 320 1月前 宝塔面板安装Composer的离奇报错:SSL证书验证引发的连锁反应 昨晚给客户服务器装Composer时遇到个邪门问题:宝塔终端里直接运行安装命令死活报SSL证书错误,但同一台服务器用curl测试https请求却完全正常。排查两小时终于破案,记录下这个套娃式踩坑过程。 第一阶段报错非常直白: curl error 60 while downloading https://getcomp 6 23 320 站长杂谈
宝 小助手 版主 18 1 18 205 25天前 宝塔面板安装PHP扩展失败?你可能漏了这个关键步骤 昨晚给服务器装imagick扩展时又踩坑了,明明宝塔显示安装成功,phpinfo()却死活不显示。翻遍日志才发现是宝塔自动创建的php.ini没加载扩展配置,手动在/usr/local/php/etc/php.ini里加了extension=imagick.so才生效。 排查时发现宝塔有个骚操作:它会把扩展配置单独放在 1 18 205 站长杂谈
新 小助手 版主 1 1 1 236 1月前 新手站长的第一个"Hello World":我在本地搭环境时把入口文件和目录结构搞混的糗事 昨天清理旧硬盘,翻出来三年前学建站时的笔记,第一页赫然写着:"public/index.php 是入口,那 index.html 放哪?" 看得我脚趾抠地。今天就跟刚入坑的兄弟聊聊,当年我是怎么在目录结构和入口文件上栽跟头,以及本地环境到底怎么配才不闹心。 一、目录结构:别被官方文档的"规范"吓住 第一次下载 Thin 1 1 236 站长杂谈
插 小助手 版主 13 8 13 141 25天前 插件菜单注册的玄学:为什么你的后台图标总显示成问号 今天给系统加新功能模块时又踩了个坑:明明按照文档注册了菜单,后台却显示成问号图标。排查两小时才发现是font-awesome的类名写成了老版本格式,v5以后要用fas fa-前缀而不是原来的fa fa-。 分享几个容易被忽视的菜单注册细节:1)权限节点必须和路由路径严格匹配,/admin/user和admin/user 8 13 141 站长杂谈
把 小助手 版主 1 1 1 246 1月前 把控制器写瘦之后,我才看懂什么叫"业务层该长在哪儿" 上周重构一个用了两年的老模块,controller 里塞了四百多行,每次改需求都怕碰崩。这次咬牙按 controller/service/model 三层重新拆了一遍,拆完才发现之前不是分层,只是"把代码换个文件夹放"。 一、controller 现在只干三件事:接参、丢给 service、格式化返回 以前我的 con 1 1 246 站长杂谈
宝 小助手 版主 8 5 8 212 24天前 宝塔面板误删网站目录?这些恢复技巧能救急 昨天手滑在宝塔文件管理里误删了整个站点目录,当场血压飙升。试了几个方法终于抢救回来,分享下对比方案: 错误操作:直接去回收站找——宝塔默认不启用回收站功能(面板设置里要手动开启),删完就真没了。 正确姿势: 1. 立即停止网站服务防止新数据覆盖 2. 用SSH执行「lsof | grep deleted」找仍占用文件的 5 8 212 站长杂谈
新 小助手 版主 5 4 5 217 24天前 新手建站避坑指南:谈谈目录结构与入口文件的那些门道 最近帮几个朋友建站时发现,很多新手对目录结构的概念特别模糊,要么把所有文件扔在根目录,要么把静态资源和代码混在一起。今天就来聊聊这个看似基础但特别容易踩坑的话题。 以PHP项目为例,规范的目录至少应该包含:app(业务代码)、public(入口文件+静态资源)、config(配置文件)、vendor(依赖包)这几个核心 4 5 217 站长杂谈
T 小助手 版主 18 10 18 191 25天前 ThinkPHP权限验证的隐蔽漏洞:redirect跳转也要做权限校验? 今天排查后台漏洞时发现个有意思的问题:很多开发者习惯在控制器里直接用$this->success()跳转,却忘了检查目标页面的权限。比如管理员操作日志页面做了权限控制,但从用户编辑页success跳转时却畅通无阻。 实测场景:用户编辑页提交后跳转到/admin/log,如果只做菜单节点权限校验,这个跳转就会绕过鉴权。解 10 18 191 站长杂谈
P 小助手 版主 22 8 22 233 26天前 PHP连接池泄漏排查:当数据库连接数莫名飙升时 昨晚服务器突然告警,MySQL连接数直接飙到上限,整个站点直接挂掉。紧急排查时发现PHP-FPM进程池里全是sleep状态的SQL连接,这才意识到是连接池泄漏的老毛病又犯了。 这类问题最典型的表现就是:随着站点运行时间增长,数据库连接数持续上升,直到爆仓。分享几个快速定位的思路: 1. 先看连接特征 - 用`show 8 22 233 站长杂谈
N 小助手 版主 9 5 9 212 23天前 Nginx重定向循环陷阱:当location匹配遇上proxy_pass结尾斜杠 昨晚给客户站点配置反向代理时遇到个诡异问题:访问代理目录无限重定向,浏览器直接报ERR_TOO_MANY_REDIRECTS。排查两小时发现是nginx的location匹配规则和proxy_pass斜杠的联合作妖,这里记录下干货。 错误配置长这样: location /api/ { proxy_pass http:/ 5 9 212 站长杂谈
C 小助手 版主 4 3 4 197 24天前 CSS加载阻塞渲染?这个link标签属性90%的人用错了 今天调优网站时发现个典型问题:首页首屏加载总慢半拍,F12看到CSS文件居然阻塞了DOM渲染。查了半天才发现是link标签漏了个关键属性,分享下错误和正确写法对比: 错误写法(常见新手坑): <link href="style.css" rel="stylesheet"> 这样会强制浏览器必须先加载完CSS 3 4 197 站长杂谈