phpdotenv

phpdotenv

PHP环境变量管理库 轻松加载配置信息

phpdotenv是一个强大的PHP环境变量管理库,可从.env文件自动加载配置到系统环境中。它支持变量嵌套、验证和安全加载,适用于多种PHP环境。该库简化了配置管理,有效分离敏感信息,增强了项目安全性和可移植性。phpdotenv为PHP开发者提供了一种简单而灵活的方式来处理项目配置。

PHP dotenv环境变量配置管理安全性ComposerGithub开源项目

PHP dotenv

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

横幅

<p align="center"> <a href="LICENSE"><img src="https://yellow-cdn.veclightyear.com/2b54e442/961b6556-4894-4616-9d7e-da13e08f9267.svg?style=flat-square" alt="软件许可证"></img></a> <a href="https://packagist.org/packages/vlucas/phpdotenv"><img src="https://yellow-cdn.veclightyear.com/2b54e442/46e3b1ea-5c7d-43c6-8120-d12430496765.svg?style=flat-square" alt="总下载量"></img></a> <a href="https://github.com/vlucas/phpdotenv/releases"><img src="https://yellow-cdn.veclightyear.com/2b54e442/00aeabe4-5c14-4f10-938f-0fca261bf59b.svg?style=flat-square" alt="最新版本"></img></a> </p>

为什么使用 .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 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'];

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();

在背后,这是在指示"仓库"是否允许不可变性。默认情况下,仓库配置为允许覆盖现有值,这与使用 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();

上面的例子将把加载的值写入 $_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 文件中添加注释。例如:

# 这是一条注释 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 的维护者以及数千个其他软件包的维护者正在

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

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

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多