ThinkPHP 公共配置应放根目录 config.php——它是框架启动时自动加载的顶层配置入口,影响所有模块、命令行及HTTP请求;common.php 仅应用层加载,易导致跨模块或命令行调用时配置缺失。

ThinkPHP 公共配置该放 config.php 还是 common.php?
放 config.php —— 它是 ThinkPHP 启动时自动加载的「顶层配置入口」,所有模块、命令行、HTTP 请求都走它;common.php 是应用层配置,只在应用初始化后加载,跨模块或命令行调用时容易漏掉。
常见错误现象:Db::connect() 在命令行里报错说找不到数据库配置,但网页正常——大概率是把数据库配置写进了 app/config.php(应用级),没同步到根目录 config.php。
- 根目录
config.php位置:项目根目录下的config.php(不是app/config.php) - 它会被
think\App::initCommonConfig()优先合并,早于任何应用配置 - 如果用了多应用模式,
config.php里的配置对所有应用生效,app/config.php只覆盖当前应用
哪些配置必须提进根目录 config.php?
核心运行依赖项,一旦缺失会导致框架启动失败或行为异常。不是“能提就提”,而是“不提就崩”。
典型场景:部署到新环境时,.env 没配好,但数据库/缓存配置又只在应用层,结果 php think optimize:config 直接报错退出。
立即学习“PHP免费学习笔记(深入)”;
-
'default_return_type'、'app_debug'、'app_timezone'—— 影响日志、响应、时间处理逻辑 -
'database'配置块(含'type'、'hostname'、'database'等)—— 命令行迁移、模型生成、php think migrate:run全靠它 -
'cache'和'log'的驱动与路径配置 —— 否则Cache::store('redis')或日志写入可能静默失败
config.php 里怎么安全引用 .env 变量?
直接写 $_ENV['DB_HOST'] 不行 —— ThinkPHP 的 Env 类还没初始化;要用 env() 函数,它在 config.php 加载阶段已就绪。
容易踩的坑:有人用 getenv('DB_HOST'),但 PHP-FPM 下默认禁用 getenv(),且不兼容 .env 文件的类型转换(比如 APP_DEBUG=true 会被当字符串,env('APP_DEBUG') 才自动转布尔)。
- 正确写法:
'hostname' => env('DB_HOST', '127.0.0.1') - 数值型别硬写字符串:
'port' => (int) env('DB_PORT', 3306),避免 PDO 报 “expected int” - 敏感配置(如密码)务必设默认值为空字符串:
'password' => env('DB_PASSWORD', ''),否则未设时会 fallback 到字面量'DB_PASSWORD'字符串
提取后本地开发和线上环境怎么隔离?
不是靠改 config.php,而是靠 .env + 环境变量组合控制。ThinkPHP 的 env() 读取顺序是:.env → 系统环境变量 → 默认值。
性能影响很小,但兼容性要注意:5.1 版本不支持嵌套数组写法(如 REDIS.HOST),必须扁平化;6.x 支持,但需确保 think\helper\env() 被正确加载。
- 本地
.env:APP_DEBUG=true、LOG_LEVEL='debug' - 线上
.env:APP_DEBUG=false、LOG_LEVEL='error'、LOG_FILE='/data/log/think.log' - 严禁在
config.php里写if (APP_ENV === 'prod') { ... }—— 配置文件不该有逻辑分支
最常被忽略的一点:config.php 修改后,php think optimize:config 生成的缓存不会自动更新,上线前必须手动清掉 runtime/cache/ 下的配置缓存文件,否则旧配置还在跑。


















