config/dev/目录不加载的首要原因是app_env未正确设置为dev且app_debug未启用;app_env必须由web服务器或cli提前注入,.env需位于项目根目录且无bom,配置键须严格匹配嵌套结构。

config/dev/ 目录存在但完全不加载?先看 APP_ENV 和 APP_DEBUG 是否真正生效
ThinkPHP 不会凭空加载 config/dev/,它只在满足两个条件时才触发:一是系统环境变量 APP_ENV=dev(注意大小写),二是 APP_DEBUG=true。缺一不可。
常见错误现象:.env 里写了 APP_ENV=dev 和 APP_DEBUG=true,但日志里还是显示 “Running in production mode”;或者 config/dev/app.php 明明改了 'debug' => true,页面却不显示错误堆栈。
-
APP_ENV必须由 Web 服务器或 CLI 环境提前注入,不能靠define('APP_ENV', 'dev')或在bootstrap/app.php里硬编码——框架启动时会覆盖它 - Nginx 需加
fastcgi_param APP_ENV dev;,Apache 加SetEnv APP_ENV dev;CLI 下必须用APP_ENV=dev php think run,而非php think run -
APP_DEBUG同样必须来自环境变量或.env,且不能被config/app.php里写的'debug' => false覆盖(因为config/dev/app.php的加载优先级更高)
config/dev/app.php 已存在,但修改后没效果?检查配置合并时机和缓存
ThinkPHP 是“先加载基础配置 → 再按环境目录合并 → 最后用 .env 覆盖”,config/dev/ 下的文件不是独立生效,而是参与 array_merge_recursive() 合并。如果键名写错、结构不匹配,就可能被忽略或静默覆盖。
- 确保
config/dev/app.php返回的是数组,且键与config/app.php对齐,例如要改调试开关,必须写return ['app_debug' => true];,而不是['debug' => true] - 每次改完
config/dev/后,必须清缓存:执行php think clear:config和php think optimize:config,否则 runtime/cache/config.php 仍用旧合并结果 - 不要在
config/app.php里写'env' => 'dev'—— 这个字段已废弃,且会干扰环境识别逻辑
为什么 env('DB_HOST') 在 config/database.php 里返回 null?.env 根本没加载
config/dev/ 不加载,往往只是表象;底层更可能是 .env 文件压根没被读取,导致 Env::get() 全部返回 null,进而让配置文件里的 env('DB_HOST') 失效。
-
.env必须放在项目根目录(即含app/、config/、composer.json的目录),不是public/下,也不是config/里 - Web 模式下,
.env在public/index.php中加载;CLI 模式(如php think migrate)默认不加载,需在think文件末尾手动加:if (PHP_SAPI === 'cli') { \Dotenv\Dotenv::createImmutable(__DIR__)->safeLoad(); } - Windows 记事本保存的
.env常带 BOM,会导致safeLoad()静默失败;务必用 VS Code 或 Notepad++ 保存为 “UTF-8 无 BOM”
config/dev/ 加载了,但 database.php 还是连本地 MySQL?环境配置没覆盖到具体键
ThinkPHP 的环境配置是“按文件名合并”,不是“按目录全局切换”。config/dev/database.php 只会覆盖 config/database.php 中同名键,其他键保持原值。容易漏掉关键字段。
- 确认
config/dev/database.php里写了完整连接信息,例如:return ['connections' => ['mysql' => ['hostname' => 'prod-db.example.com']]];,而不是只写['hostname' => '...'](这会被忽略,因键路径不匹配) - ThinkPHP 6+ 的数据库配置结构是嵌套的,
hostname不在顶层,而在connections.mysql.hostname,所以环境配置也必须保持相同层级 - 用
config('database.connections.mysql.hostname')在控制器里打印验证,别只信日志或报错——有时连接失败是 DNS 或权限问题,不是配置没生效
最常被忽略的一点:ThinkPHP 的“环境目录”机制依赖精确的目录名匹配,APP_ENV=development 就必须建 config/development/,写成 config/dev/ 就不会加载。大小写、拼写、斜杠方向,差一点,整个目录就被跳过。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











