自动将环境变量从.env
加载到getenv()
、 $_ENV
和$_SERVER
。
您绝对不应该在代码中存储敏感凭据。在环境中存储配置是十二要素应用程序的原则之一。部署环境之间可能发生变化的任何内容(例如数据库凭据或第三方服务的凭据)都应从代码中提取到环境变量中。
基本上, .env
文件是加载应用程序所需的自定义配置变量的简单方法,而无需修改 .htaccess 文件或 Apache/nginx 虚拟主机。这意味着您不必编辑项目外部的任何文件,并且无论您如何运行项目(Apache、Nginx、CLI,甚至 PHP 的内置 Web 服务器),所有环境变量始终都会设置。它比您所知道的所有其他设置环境变量的方法要容易得多,并且您一定会喜欢它!
php_value
标志PHP dotenv 是原始 Ruby dotenv 的 PHP 版本。
通过 Composer 安装非常简单:
$ composer require vlucas/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__ );
$ dotenv -> safeLoad ();
如果您想使用.env
之外的其他内容,您可以选择传入文件名作为第二个参数:
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
所有定义的变量现在都可以在$_ENV
和$_SERVER
超级全局变量中使用。
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
强烈建议不要使用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 ();
在幕后,这是指示“存储库”是否允许不变性。默认情况下,存储库配置为允许默认覆盖现有值,如果使用RepositoryBuilder
调用“create”方法来构造更自定义的存储库,则这是相关的:
$ 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 ();
上面的示例将加载的值写入$_ENV
和putenv
,但是在插入环境变量时,我们只会从$_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 n BAZ= " Hello $ {FOO} "" );
这与以下完全相同:
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
只是,您没有提供查找文件的目录,而是直接提供了文件内容。
当新开发人员克隆您的代码库时,他们将需要执行额外的一次性步骤,将.env.example
文件手动复制到.env
并填写自己的值(或从项目同事获取任何敏感值)。
在某些服务器设置中(最常见于共享主机),PHP 可能会停用$_ENV
或$_SERVER
等超全局变量。如果未设置这些变量,请检查php.ini
文件中的variables_order
。请参阅 php.net/manual/en/ini.core.php#ini.variables-order。
如果您发现此软件包中存在安全漏洞,请发送电子邮件至 [email protected]。所有安全漏洞都将得到及时解决。您可以在此处查看我们完整的安全政策。
PHP dotenv 根据 BSD 3-Clause License 获得许可。
作为 Tidelift 订阅的一部分提供
vlucas/phpdotenv
和数千个其他软件包的维护者正在与 Tidelift 合作,为您用于构建应用程序的开源依赖项提供商业支持和维护。节省时间、降低风险并改善代码运行状况,同时向您使用的确切依赖项的维护者付费。了解更多。