.env 配置文件适用范围
.env 文件主要的作用是存储环境变量,也就是会随着环境变化的东西,比如数据库的用户名、密码、缓存驱动、时区,还有静态文件的存储路径之类的;
因为这些信息应该是和环境绑定的,不应该随代码的更新而变化,所以一般不会把 .env 文件放到版本控制中;
除了和环境绑定的环境变量,有时候一些安全系数比较高,不希望纳入版本控制的信息也会放进 .env 文件,比如第三方API的secret之类的;
.env 中的基本语法
说是语法……但真的很简单就是了
.env 中的数据按行划分, 每条数据占一行,数据之间可以有任意多的空行
每条数据的核心是一个等号,等号左侧是 key,右侧是 value
[app]
debug = true
trace = true
[mysql]
host = 127.0.0.1
user = root
password = 123456
database = test
在 key 的前后和 value 的前后都可以添加任意多的空格,读取时会自动去除前后空格
比如有这样一条配置项:
KEY = value
在PHP中读取的时候,就会自动去除空格
echo env('KEY') === 'value'; //true
如果 key 或者 value 中包含空格,就需要在两端加上双引号,比如这样:
"TEST KEY" = "test value"
如果需要添加注释,可以使用#
,比如这样:
#测试单行注释
KEY=value #测试行末注释
如果需要嵌套变量的话,也可以直接在 .env 中写, 借用官方的例子:
BASE_DIR="/var/webroot/project-root"
CACHE_DIR="${BASE_DIR}/cache"
TMP_DIR="${BASE_DIR}/tmp"
.env 可以存储的内容
前文说了,.env 是非常简单的配置文件,简单到什么程度呢?
它只支持一维K/V格式的配置项,而且 key 和 value 都只能是字符串。
那如果想存一个列表怎么办?
有的时候我们需要在配置文件里存一个列表,比如支付平台调用 webhook 的时候只会从固定的IP地址发起,那我们可能就会为了安全性,把这些IP地址放到一个白名单中,每次验证一下来源IP是否在名单列表之内;
像这种白名单列表有办法存到 .env 中么?
只能说……不能直接存进去,因为 .env 很简单,它的 value 只能是字符串,不过我们可以尝试变通一下,使用一个连接符(比如半角逗号,
)把白名单地址拼成一个字符串,使用时再分割开:
WHITE_LIST=192.168.0.1,192.168.0.2,192.168.0.3
.env 怎么读取文件呢?
<?php
$rootPath = dirname(realpath($_SERVER['SCRIPT_FILENAME'])) . DIRECTORY_SEPARATOR;
// 加载环境变量配置文件
if (is_file($rootPath . '.env')) {
$env = parse_ini_file($rootPath . '.env', true);
foreach ($env as $key => $val) {
$name = strtoupper($key);
if (is_array($val)) {
foreach ($val as $k => $v) {
$item = $name . '_' . strtoupper($k);
putenv("$item=$v");
}
} else {
putenv("$name=$val");
}
}
}
$result = getenv(strtoupper(str_replace('.', '_', 'app.debug')));
var_dump($result);
[app]
debug = true
trace = true
[mysql]
host = 127.0.0.1
user = root
password = 123456
database = test