ThinkPHP 5.1 通过根目录 .env 文件实现环境配置分离,自动加载 vendor/vlucas/phpdotenv,在配置文件中用 env() 动态读取,支持分组语法、默认值及类型转换,需忽略 Git 并确保无 BOM。

在项目根目录创建 .env 文件
不是 application/ 或 config/ 目录,而是和 public/、thinkphp/ 同级的项目根目录。用编辑器新建文件并命名为 .env(Windows 下需注意不能带后缀,可用记事本另存为选择“所有文件”类型)。
内容示例:
APP_ENV=dev
APP_DEBUG=true
[database]
hostname = 192.168.1.100
database = myapp_prod
username = dbuser
password = s3cure123
hostport = 3306
prefix = tp_
注意:.env 文件必须加入 .gitignore,禁止提交到代码仓库。
立即学习“PHP免费学习笔记(深入)”;
确保框架能识别并加载 .env
TP5.1 默认支持 .env,但需确认入口文件或引导逻辑中已启用加载机制。若发现 env() 返回空,检查是否漏了以下关键点:
- 项目根目录下存在
vendor/vlucas/phpdotenv(Composer 自动安装) - 没有手动禁用
Env加载(如覆盖了think\App初始化流程) -
.env文件权限可读,且无 BOM 头(推荐用 UTF-8 无 BOM 编码保存)
如果需要显式控制加载行为(比如多环境文件),可在 public/index.php 开头补充:
if (!getenv('APP_ENV')) { putenv('APP_ENV=' . ($_SERVER['APP_ENV'] ?? 'dev')); }
$envFile = __DIR__ . '/../.env.' . getenv('APP_ENV');
if (is_file($envFile)) {
Dotenv\Dotenv::createImmutable(__DIR__ . '/..', basename($envFile))->load();
}
在 config/*.php 中用 env() 替换固定值
打开 config/database.php 等配置文件,将原来写死的参数改为调用 env():
'hostname' => env('database.hostname', '127.0.0.1'),
'database' => env('database.database', 'thinkphp'),
'username' => env('database.username', 'root'),
'password' => env('database.password', ''),
'hostport' => (int) env('database.hostport', 3306),
'prefix' => env('database.prefix', 'tp_'),
说明:
- 支持点号语法读取分组项(如
database.hostname),不区分大小写 - 第二个参数是默认值,当
.env中未定义该变量时生效 - 数值型字段建议显式类型转换(如
(int)),避免字符串隐式转换出错
验证与切换环境
APP_ENV 是框架识别环境的关键变量。它决定两件事:
- 是否启用调试模式(
APP_DEBUG若在.env中设置,会自动覆盖应用配置) - 是否影响路由、日志、缓存等行为分支(例如中间件中用
Env::get('APP_ENV') === 'dev'判断)
切换环境只需改 .env 中的 APP_ENV=prod,Web 请求下次刷新即生效;CLI 命令需重启进程(如 php think optimize:config 后再运行)。
线上部署时,可单独准备 .env.prod,通过系统级环境变量指定加载:
export APP_ENV=prod
php think serve



















