ThinkPHP 5.1 开始原生支持 .env 配置,这对需要区分本地开发、测试和生产环境的项目很实用。与其频繁修改 config 目录下的配置文件,不如把容易变动的参数抽出来统一管理。下面就按实际使用顺序,梳理 ThinkPHP 5.1 中 .env 的配置方式、读取方法,以及接入数据库配置时该怎么写。
ThinkPHP 5.1 支持哪些配置格式
从 ThinkPHP 5 发布以来,配置方式一直在往更灵活的方向走。到了 ThinkPHP 5.1,框架已经支持多种配置类型,包括 .ini、.xml、.json、.yaml 和 .php。
其中本文要用到的 .env,本质上就是采用 ini 风格来组织配置项。它主要用于在开发过程中模拟环境变量配置,让不同环境下的参数分离得更清楚。通常建议把这个文件加入忽略列表,避免部署时被误覆盖。
如何创建并编写 .env 文件
.env 文件需要创建在项目根目录,不是 application 目录,这一点很容易放错。

一个常见的配置示例如下:
APP_DEBUG = true
APP_TRACE = true
[DATABASE]
HOSTNAME = 127.0.0.1
DATABASE = test
HOSTPORT = 3306
USERNAME = root
PASSWORD = 123456
PREFIX = test_
这里可以看到两类内容:
APP_DEBUG、APP_TRACE这类全局开关配置;[DATABASE]分组下的数据库连接参数。
这种写法的好处是,环境差异集中在一个文件里,切换机器或切换环境时不需要反复改业务配置文件。
配置写好后怎么读取
配置写入 .env 后,可以通过 Env 类读取:
// 获取环境变量 如果不存在则使用默认值root
Env::get('database.username','root');
如果你更习惯使用助手函数,也可以直接这样写:
env('database.username', 'root')
这里有两个关键点值得注意:
1. 环境变量名不区分大小写
也就是说,配置里写 USERNAME,读取时用 database.username 也是可以的,大小写不会成为问题。

2. 并不是所有参数都会自动注入到应用配置
APP_DEBUG 和 APP_TRACE 这两个参数会自动生效,而且它们的优先级高于应用自身的配置文件。
但除此之外,像数据库主机、用户名、密码这类参数,并不会自动替换原配置,必须显式通过 Env::get 或 env() 来读取后再接入配置文件。
怎样把 .env 接入数据库配置文件
实际项目里,更常见的做法是在 config/database.php 中调用 env(),把数据库配置改成从 .env 读取:
return [
// ……
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database', 'test'),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', '123456'),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库表前缀
'prefix' => env('database.prefix', ''),
// ……
];
这种写法有两个直接好处:
- 本地开发时,直接改根目录下的
.env即可; - 上线到不同服务器时,只需要准备对应环境的
.env文件,不必来回改动config/database.php。
除了数据库配置,其他配置项也可以照这个思路处理。只要是不同环境之间可能变化的值,都可以通过 env() 读取,再交给具体配置文件使用。
上线部署时要注意什么
开发环境里用 .env 很方便,但部署时要特别注意文件管理方式。
比较稳妥的做法是:在线上单独保留一份 .env,把生产环境需要的配置填好,并确保这个文件被忽略,不要随着代码发布反复覆盖。否则一旦发布时把线上的 .env 替换掉,就可能直接影响生产环境的数据库连接或调试开关。
从使用体验看,.env 的价值就在于把“环境差异”从“应用配置”里拆出来。这样一来,日常开发不用每次都去改 config 里的参数,配置层次也会更清晰。









