thinkphp6.0目录结构是运行契约而非静态图示:app模块名须全小写(如admin),config下php文件仅根目录自动加载(如database.php→config::get('database')),runtime必须775权限且不可部分清理,否则触发cpu尖峰。

ThinkPHP6.0 的目录结构不是“看看就行”的静态图示,而是直接影响路由能否匹配、配置能否加载、类能否自动实例化的运行契约。错放一个文件,php think make:controller Admin/Index 生成的类可能永远不被识别;改错一个目录名,app/admin 下的控制器在访问 /admin/index 时直接报 ClassNotFoundException。
为什么 app 目录下的模块名必须全小写
ThinkPHP6 默认启用多应用模式时,会把 app 下的子目录名强制转为小写作为模块标识。比如你手动建了 app/Admin,框架内部只认 admin 模块——但命名空间、路由定义、命令行生成器仍按你写的 Admin 处理,结果就是路径、命名空间、实际目录三者对不上。
- 始终用全小写字母命名模块目录,如
app/admin、app/api - 检查
config/app.php中的'default_module' => 'index'是否与真实目录名一致(比如设为'admin'就得有app/admin) - 如果用单应用模式(无子目录),就别在
app下建任何子目录,所有控制器直接放在app/controller
config 目录哪些文件会被自动加载
config/ 下的 PHP 文件(仅根目录,不含子目录)会自动合并进配置系统,文件名即为配置分组名。例如 config/database.php 对应 Config::get('database'),但 config/database/mysql.php 完全不会被识别,也不会成为 database.mysql 子项。
- 业务配置(如微信、支付)建议平铺在
config/根目录,如config/wechat.php - 敏感配置(数据库密码、API密钥)必须写进
.env,而非 PHP 配置文件 - 自定义配置文件需显式调用
Config::load(),不能依赖自动加载
runtime 目录权限和清理的关键细节
runtime 是缓存、日志、模板编译的实际落盘位置,它必须可写,但很多人只给 755 权限,却忽略子目录继承问题——导致日志能写入,但 runtime/view 编译失败,页面每次请求都重新解析模板,CPU 瞬间拉满。
- 部署时执行
chmod -R 775 runtime/(Linux)或确保 Web 服务器用户对整个runtime有完全控制权(Windows) -
runtime/log和runtime/cache可定期清空;但删掉runtime/view会强制重编译,高并发下易引发 CPU 尖峰 - 上线后务必关闭调试模式(
APP_DEBUG = false),否则runtime会持续写入大量 trace 日志
真正容易被忽略的,是 ThinkPHP 不靠“扫描”而靠“约定路径”触发机制:改了 app/controller 名字却不同步改 config/app.php 里的 'controller_layer' 和命名空间映射,整个控制器层就彻底失效。它不是文件夹,是一套运行时契约。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











