敏感配置如数据库密码等不能写死在config.php,应放于.env文件;.env需置于根目录并禁止web访问,环境变量需加app_/db_等前缀才能自动注入;app_debug=true需显式转换类型;线上应限制日志级别为error/notice并禁用debug日志;可通过extra数组或config::load()按需加载配置;runtime目录需可读写,否则导致配置缓存失效、cpu飙升。

ThinkPHP 配置文件里哪些项不能写死在 config.php?
因为会被缓存覆盖或部署时覆盖,.env 文件才是隐藏敏感配置的正解。ThinkPHP 6+ 默认启用 dotenv 支持,但很多人直接往 config/database.php 里填 DB_PASSWORD,结果上线后密钥硬编码进 Git,被扫出来。
-
.env必须放在根目录(和think命令同级),且不能被 Web 目录直接访问(Nginx/Apache 要禁止location ~ /\.env) - 环境变量名需加前缀
APP_、DB_等才自动注入配置,例如DB_HOST=127.0.0.1→ 在代码里用Config::get('database.hostname')就能取到 -
.env中的值默认是字符串,数字/布尔要显式转:比如APP_DEBUG=true不会自动变true,得在配置文件里用env('APP_DEBUG', false) === 'true'
为什么 config/app.php 的 app_debug 设为 false 还报错堆栈?
因为 app_debug 只控制是否显示错误页面,不关闭日志记录;真正屏蔽调试信息的是 log.level 和 log.file 的组合。线上环境常见误操作是只关了 app_debug,却没关 log 的 debug 级别,导致错误全写进日志还暴露在 runtime/log/ 下。
- 生产环境务必设
'level' => ['error', 'notice'],去掉'debug' -
'file' => env('LOG_FILE', '');设为空字符串可禁用日志文件(但建议保留 error 日志) - 如果用了
think-swoole,还要额外检查swoole.log_file配置项,它不走统一日志系统
如何让 ThinkPHP 不加载某个配置文件(比如本地开发专用的 wechat.php)?
ThinkPHP 会自动加载 config/ 下所有 PHP 文件,没有“白名单”机制。靠删文件或加 if 判断都不稳定——部署脚本可能覆盖,条件判断又容易漏掉环境检测逻辑。
- 正确做法是改文件名:把
wechat.php改成wechat_dev.php,然后在config/app.php的extra数组里按环境加载:'extra' => env('APP_ENV') === 'dev' ? ['wechat_dev'] : [] - 更稳妥的是用
Config::load()手动加载,只在需要的地方调用,避免全局污染 - 注意:
extra加载的配置优先级低于主配置,但高于环境变量,冲突时以主配置为准
Runtime 目录权限和缓存配置搞错会导致什么?
ThinkPHP 把编译后的配置缓存到 runtime/cache/,如果这个目录不可写,或者 config_cache_on 开着但 runtime 权限不对,就会静默失败——不是报错,而是每次请求都重新解析全部配置,CPU 拉满,接口变慢 3–5 倍。
- 确认
runtime/所有子目录(cache、log、temp)对 Web 用户可读写,Linux 下常用chown -R www:www runtime -
config_cache_on默认 true,但 Docker 或 Serverless 环境建议关掉,改用php think optimize:config构建时生成静态缓存 - 如果用了 APCu 或 Redis 缓存驱动,
config_cache_type要对应设为apcu或redis,否则仍会 fallback 到文件缓存
最常被忽略的是:本地开发关了 config_cache_on,但上线忘记打开,或者开了却没清空旧的 runtime/cache/,导致新配置不生效——这时候看 runtime/log/ 里的 warning 日志比猜更有效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











