ThinkPHP6路由404但加/index.php能访问,主因是Web服务器未正确转发请求至入口文件;Apache需确认.htaccess启用且含RewriteRule ^(.)$ index.php [L],Nginx须用if (!-e $request_filename) { rewrite ^(.)$ /index.php?s=/$1 last; },禁用Laravel式配置。

ThinkPHP6路由404但加/index.php能访问?查重写规则
这不是代码问题,是Web服务器没把请求转发到入口文件。Apache下检查.htaccess是否启用,关键行必须是RewriteRule ^(.*)$ index.php [L];Nginx用户别抄Laravel配置,得用官方推荐写法:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; }。用php think run本地调试时路由默认全通,上线前务必切回真实环境验证。
Db::transaction()不生效?别混用db()和Db::name()
事务失败最常见的原因是混用数据库调用方式。比如在Db::transaction()里写了db('repair')->insert(...),这个操作走的是独立连接,完全不参与当前事务上下文。所有事务内操作必须统一:要么全用Db::name('repair'),要么全用继承Model的类(如RepairModel::create())。报修提交+扣费+发通知这类强一致性场景,漏掉一个就可能数据不一致。
Redis缓存键冲突炸库?必须加业务前缀
新手常写Cache::set('list', $data),结果公告列表、门禁记录、用户头像都往同一个list键里塞,互相覆盖。正确做法是带明确业务标识:Cache::set('notice:list', $data, 3600)、Cache::set('repair:hot', $data, 1800)。高频写入场景(如门禁记录)还要关掉模型事件:protected $event = [];,否则每次save()都触发before_insert,响应延迟明显。
Auth权限校验硬写if判断?抽成中间件再绑定分组
在每个控制器方法里写if ($user->role !== 'admin') die();,后期改权限策略会疯掉。直接用think\facade\Auth,初始化后调用Auth::check('admin')或Auth::hasRole('property')。重点是把校验逻辑抽成中间件(如CheckRole),然后在app/middleware.php里按分组绑定:'admin' => [CheckRole::class]。注意:Auth默认从session读用户,如果用了JWT或Redis存token,得重写Auth::setUser()注入当前用户对象。
立即学习“PHP免费学习笔记(深入)”;
缓存键命名、事务边界、权限抽象——这些不是“高级技巧”,而是上线前必须确认的硬性检查点。漏掉任何一个,都可能在高并发或权限变更时突然暴露问题。



















