自动将环境变量从 .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 文件中添加注释。例如:
# 这是一条注释 VAR="value" # 注释 VAR=value # 注释
有时你只想解析文件并解析嵌套的环境变量,通过给我们一个字符串,并返回一个数组给你。虽然这已经是可能的,但有点麻烦,所以我们提供了一种直接的方法来做到这一点:
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar'] Dotenv\Dotenv::parse("FOO=Bar\nBAZ=\"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。
如果你在此软件包中发现安全漏洞,请发送电子邮件至 security@tidelift.com。我们将立即处理所有安全漏洞。你可以在这里查看我们的完整安全政策。
PHP dotenv 根据 BSD 3-Clause 许可证 授权。
作为 Tidelift 订阅的一部分提供
vlucas/phpdotenv 的维护者以及数千个其他软件包的维护者正在


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定 ,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号