ThinkPHP目录结构虽可自定义但需严格遵循约定:app模块目录必须全小写,config仅自动加载根目录PHP文件,runtime须设可写权限并定期清理。

ThinkPHP 的目录结构不是固定死的,但默认骨架决定了你写代码时“自然往哪放”,改错位置会导致路由找不到、模型加载失败、配置不生效。
为什么 app 目录下的模块名必须小写?
ThinkPHP 6 默认开启模块多应用模式时,app 下的子目录名会被自动转成小写作为模块标识。如果你建了个叫 Admin 的目录,框架实际认的是 admin 模块 —— 但控制器命名空间、路由定义、命令行生成器都按你写的原名走,结果就是 php think make:controller Admin/Index 生成的类,在访问 /admin/index/index 时抛出 ClassNotFoundException。
- 始终用全小写字母命名
app下的模块目录(如app/admin、app/api) - 检查
config/app.php中的'default_module' => 'index'是否与真实目录名一致 - 如果禁用多应用(即单应用模式),
app下不应有子目录,所有控制器直接放在app/controller
config 目录里哪些文件会被自动加载?
ThinkPHP 6 使用 think\facade\Config 读取配置时,只自动合并 config/ 下的 PHP 文件(不含子目录),且文件名就是配置分组名。比如 config/database.php 对应 Config::get('database');但 config/database/mysql.php 不会自动载入,也不会被识别为 database.mysql 子项。
- 业务配置建议平铺在
config/根目录,如config/alipay.php、config/wechat.php - 环境变量相关的配置(如数据库密码)应写在
.env,而非 PHP 配置文件中 - 自定义配置文件需手动调用
Config::load()才能生效,不能依赖自动加载
runtime 目录权限和清理时机
runtime 是运行时生成缓存、日志、模板编译文件的地方。它必须可写,但很多人只给 755 却忽略子目录继承问题 —— 导致日志能写、但模板缓存写失败,页面反复重新编译,性能骤降。
立即学习“PHP免费学习笔记(深入)”;
- 部署时执行
chmod -R 775 runtime/(Linux)或确保 IIS/Apache 用户对整个runtime有完全控制权(Windows) -
runtime/log和runtime/cache可定期清理,但runtime/view删了会强制重编译,高并发下可能引发瞬时 CPU 尖峰 - 上线后建议关闭调试模式(
APP_DEBUG = false),否则runtime会持续写入大量 trace 日志
真正容易出问题的,是把 ThinkPHP 当成普通文件夹来组织 —— 它的自动加载、路由解析、配置合并全靠约定路径触发。哪怕只是把 app/controller 改名叫 app/handler,没同步改 config/app.php 里的 'controller_layer' 和命名空间映射,整个控制器层就废了。











