ThinkPHP6目录结构严格约定,public是唯一Web入口且DocumentRoot必须指向它,否则将导致404、白屏或config/.env泄露;静态资源须放public/static/,app仅存业务代码且不可直接访问,runtime需可写但上线前须降权。

ThinkPHP6 的目录结构不是“随便放哪都行”的扁平布局,改错一个位置,轻则 404、白屏,重则直接泄露 .env 或 config/database.php —— 这不是警告,是常见线上事故的起点。
public 是唯一 Web 入口,不是“放静态文件的普通文件夹”
Apache/Nginx 的 DocumentRoot 必须指向 public/,不能指向项目根目录。否则用户能直接通过浏览器访问 http://localhost/config/database.php,数据库密码瞬间暴露。
-
public/index.php是所有请求的唯一入口,框架生命周期从这里启动 - 静态资源(CSS/JS/图片)必须放在
public/static/下,URL 路径才对应为/static/css/app.css - 本地用
php think run启动时,它内部已自动以public/为根目录;但用 XAMPP 或 Nginx 部署时,必须手动配置虚拟主机并启用mod_rewrite和AllowOverride All - 误把
index.php挪到根目录或app/下,会导致路由失效、模板不渲染,甚至让config/目录被直接下载
app 目录只放业务代码,且不可被 Web 直接访问
app/ 是模块容器,不是“代码垃圾桶”。它默认被 Web 服务器禁止 HTTP 访问,所有请求必须经 public/index.php 转发进来。
- 模块名(如
index、admin)必须全小写,大小写错误会触发类加载失败(Class not found) - 控制器必须放在
app/{module}/controller/下,文件名与类名严格一致(Index.php→class Index) -
app/{module}/view/下的模板(如index/index.html)不能直接用浏览器打开,必须由控制器调用view()渲染 - 别把 CSS/JS 往
app/里扔——Web 服务器不提供该路径的 HTTP 服务,必然 404
config 和 .env 不是“写完就忘”的配置文件
config/ 下的 PHP 文件(如 database.php)会被自动加载,但子目录里的配置(如 config/database/mysql.php)不会被识别;而 .env 的修改常因缓存失效导致“改了没反应”。
立即学习“PHP免费学习笔记(深入)”;
-
config/只加载一级 PHP 文件,不递归扫描子目录 -
.env中的APP_DEBUG=true修改后,必须清空runtime/config/,否则框架仍读缓存旧值 - 多应用模式下,
app/{module}/config/中的配置优先级高于config/全局配置 -
config/app.php中的'default_module' => 'index'必须与实际存在的模块目录名完全一致(全小写、无拼写误差)
runtime 必须可写,但权限不能一直开着
runtime/ 存的是缓存、日志、模板编译结果,首次访问时框架会自动生成 cache/、log/、temp/ 子目录。权限不对,APP_DEBUG=false 下连错误都看不到,只有空白页。
- 开发阶段可临时执行
chmod -R 777 runtime排查问题 - 上线前必须改为
755,并确保属组正确(如chown -R :www-data runtime) -
runtime/下的文件不能手动编辑,它是纯运行时产物;清理时也应按子目录精准删(如只清runtime/cache/,而非整个runtime/) - 最易忽略的是:改了
.env却没清runtime/config/,或者清了runtime/却忘了重启 PHP-FPM 进程,导致新配置迟迟不生效



















