alzen8work/phpdotenv

自动将环境变量从 `.env` 文件加载到 `getenv()`、`$_ENV` 和 `$_SERVER`。


README

自动将环境变量从 .env 文件加载到 getenv()$_ENV$_SERVER

Banner

Software License Total Downloads Latest Version

为什么是 .env?

永远不要将敏感凭证存储在代码中。配置存储在环境变量中十二要素应用的一条原则。任何可能在部署环境之间变化的内容(如数据库凭证或第三方服务的凭证)都应该从代码中提取出来,存储在环境变量中。

基本上,一个 .env 文件是加载应用所需的自定义配置变量的一种简单方式,无需修改 .htaccess 文件或 Apache/nginx 虚拟主机。这意味着您无需编辑项目外的任何文件,无论您如何运行项目(Apache、Nginx、CLI,甚至是 PHP 内置的 web 服务器),所有环境变量都会设置好。这比您知道的所有其他设置环境变量的方式都要简单得多,您一定会喜欢它!

  • 无需在 Apache 或 Nginx 中编辑虚拟主机
  • 无需向 .htaccess 文件中添加 php_value 标志
  • 易于便携和共享所需的 ENV 值
  • 与 PHP 内置的 web 服务器和 CLI 运行器兼容

PHP dotenv 是原始 Ruby dotenv 的 PHP 版本。

安装

通过 Composer 安装非常简单

$ composer require alzen8work/phpdotenv

或者手动将其添加到您的 composer.json 文件中。

升级

我们遵循 语义版本控制,这意味着在主要版本之间可能会发生破坏性变更。我们提供了从 V2 到 V3、V3 到 V4 和 V4 到 V5 的升级指南,可在此处找到:这里

使用方法

通常,`.env` 文件不会放入版本控制中,因为它可能包含敏感的 API 密钥和密码。创建一个包含所有必需环境变量定义(除了敏感变量)的单独的 `.env.example` 文件,这些敏感变量由用户提供,用于他们的开发环境,或者通过其他方式传达给项目合作者。然后项目合作者独立地将 `.env.example` 文件复制到本地 `.env`,并确保所有设置对于他们的本地环境都是正确的,在必要时填写秘密密钥或提供自己的值。在这种使用方式中,应将 `.env` 文件添加到项目的 `.gitignore` 文件中,以确保合作者不会将其提交到代码中。这种使用方式确保敏感密码或 API 密钥永远不会出现在版本控制历史中,从而降低了安全漏洞的风险,并且生产值永远不会与所有项目合作者共享。

将您的应用配置添加到项目根目录下的 .env 文件中。请确保将 .env 文件添加到您的 .gitignore 中,以便它不会被检查到代码中

S3_BUCKET="dotenv"
SECRET_KEY="souper_seekret_key"

现在创建一个名为 .env.example 的文件,并将其添加到项目中。这个文件应包含所需的 ENV 变量,但值应留空或填写示例数据。目的是让人们知道需要哪些变量,但不要提供敏感的生产值。

S3_BUCKET="devbucket"
SECRET_KEY="abc123"

然后,您可以使用以下方式在应用程序中加载 .env

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

可选地,您可以将文件名作为第二个参数传递,如果您想使用除 .env 之外的其他文件。

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, 'myconfig');
$dotenv->load();

现在,所有定义的变量都可在 $_ENV$_SERVER 超全局变量中使用。

$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];

Putenv 和 Getenv

由于这些函数不是线程安全的,使用 getenv()putenv() 被强烈建议。但是,您仍然可以指示 PHP dotenv 使用这些函数。代替调用 Dotenv::createImmutable,您可以调用 Dotenv::createUnsafeImmutable,这将幕后添加 PutenvAdapter。现在,您可以使用 getenv 方法以及超全局变量来访问环境变量。

$s3_bucket = getenv('S3_BUCKET');
$s3_bucket = $_ENV['S3_BUCKET'];
$s3_bucket = $_SERVER['S3_BUCKET'];

嵌套变量

可以在另一个环境变量内嵌套环境变量,这有助于减少重复。

这是通过将现有环境变量包裹在 ${…} 中来完成的,例如:

BASE_DIR="/var/webroot/project-root"
CACHE_DIR="${BASE_DIR}/cache"
TMP_DIR="${BASE_DIR}/tmp"

不可变性和仓库定制

不可变性指的是 Dotenv 是否允许覆盖现有的环境变量。如果您想允许 Dotenv 覆盖现有的环境变量,请使用 createMutable 而不是 createImmutable

$dotenv = Dotenv\Dotenv::createMutable(__DIR__);
$dotenv->load();

幕后,这是在指示“仓库”是否允许不可变性。默认情况下,仓库配置为允许覆盖现有值,这在调用“create”方法时使用 RepositoryBuilder 构造更自定义的仓库时是相关的。

$repository = Dotenv\Repository\RepositoryBuilder::createWithNoAdapters()
    ->addAdapter(Dotenv\Repository\Adapter\EnvConstAdapter::class)
    ->addWriter(Dotenv\Repository\Adapter\PutenvAdapter::class)
    ->immutable()
    ->make();

$dotenv = Dotenv\Dotenv::create($repository, __DIR__);
$dotenv->load();

上面的示例将加载的值写入 $_ENVputenv,但在插值环境变量时,我们只从 $_ENV 读取。此外,它永远不会替换在加载文件之前已设置的任何变量。

通过另一个示例,也可以指定一组允许的变量。也就是说,只有允许列表中的变量将被加载。

$repository = Dotenv\Repository\RepositoryBuilder::createWithDefaultAdapters()
    ->allowList(['FOO', 'BAR'])
    ->make();

$dotenv = Dotenv\Dotenv::create($repository, __DIR__);
$dotenv->load();

要求设置变量

PHP dotenv 具有内置的验证功能,包括强制环境变量的存在。这特别有用,可以让人们知道任何明确要求设置的变量,没有这些变量应用程序将无法运行。

您可以使用单个字符串

$dotenv->required('DATABASE_DSN');

或字符串数组

$dotenv->required(['DB_HOST', 'DB_NAME', 'DB_USER', 'DB_PASS']);

如果缺少任何 ENV 变量,Dotenv 将抛出类似于这样的 RuntimeException

One or more environment variables failed assertions: DATABASE_DSN is missing

空变量

除了要求设置变量之外,您可能还需要确保变量不为空。

$dotenv->required('DATABASE_DSN')->notEmpty();

如果环境变量为空,您将得到一个异常。

One or more environment variables failed assertions: DATABASE_DSN is empty

整数变量

您可能还需要确保变量是整数值。您可以进行以下操作:

$dotenv->required('FOO')->isInteger();

如果环境变量不是整数,您将得到一个异常。

One or more environment variables failed assertions: FOO is not an integer.

我们同样支持在变量设置时强制验证规则。

$dotenv->ifPresent('FOO')->isInteger();

布尔变量

您可能需要确保变量是布尔形式,接受“true”、“false”、“On”、“1”、“Yes”、“Off”、“0”和“No”。您可以这样做:

$dotenv->required('FOO')->isBoolean();

如果环境变量不是布尔值,您将得到一个异常。

One or more environment variables failed assertions: FOO is not a boolean.

类似地,您可以写:

$dotenv->ifPresent('FOO')->isBoolean();

允许的值

您还可以定义环境变量应该具有的一组值。这在代码只支持少数选项或驱动程序的情况下特别有用。

$dotenv->required('SESSION_STORE')->allowedValues(['Filesystem', 'Memcached']);

如果环境变量不在允许值的列表中,您将得到类似的异常。

One or more environment variables failed assertions: SESSION_STORE is not an allowed value.

您还可以定义一个正则表达式,以确定环境变量的值。

$dotenv->required('FOO')->allowedRegexValues('([[:lower:]]{3})');

注释

您可以使用 # 字符对 .env 文件进行注释。例如:

# this is a comment
VAR="value" # comment
VAR=value # comment

不加载解析

有时你只想解析文件并解析嵌套的环境变量,通过给我们一个字符串,然后返回一个数组给你。虽然这已经可能,但这有点麻烦,所以我们提供了一个直接的方法来做到这一点

// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv\Dotenv::parse("FOO=Bar\nBAZ=\"Hello \${FOO}\"");

这完全等同于

Dotenv\Dotenv::createArrayBacked(__DIR__)->load();

只是,你直接提供了文件内容,而不是提供查找文件的目录。

使用说明

当新开发者克隆你的代码库时,他们需要额外的一次性步骤手动将 .env.example 文件复制到 .env 并填写自己的值(或从项目同事那里获取任何敏感值)。

安全

如果你在这个包中发现安全漏洞,请发送电子邮件给 Graham Campbell,地址为 graham@alt-three.com。所有安全漏洞都将得到及时解决。您可以在此查看我们的完整安全策略 这里

许可证

PHP dotenv 在 BSD 3-Clause 许可证下授权。

对企业

作为 Tidelift 订阅的一部分提供

vlucas/phpdotenv 的维护者以及数千个其他包的维护者正在与 Tidelift 合作,为构建应用程序时使用的开源依赖项提供商业支持和维护。节省时间,降低风险,并提高代码质量,同时支付你使用的确切依赖项的维护者。了解更多信息 点击这里