nystudio107 / dotenvy
通过将.env文件替换为Apache、Nginx和shell等效的关键字/值变量对来加速您的生产站点。
Requires
- php: >=7.0.0
- vlucas/phpdotenv: ^3.4.0
README
Dotenvy
通过将.env文件替换为Apache、Nginx和shell等效的关键字/值变量对来加速您的生产站点
要求
PHP 7.0或更高版本,以及使用Composer的项目
安装
要安装此包,请按照以下说明操作。
-
打开您的终端并进入您的项目
cd /path/to/project
-
然后告诉Composer需要该包
composer require nystudio107/dotenvy
CraftQuest.io视频:使用Dotenvy注入环境变量
Dotenvy概述
Dotenvy是一个小型工具,它将您的.env文件内容转换为可以直接粘贴到Apache服务器配置、Nginx服务器配置、shell CLI .bashrc或Docker Dockerfile的格式。
为什么?因为根据phpdotenv文档
phpdotenv是为开发环境制作的,通常不应在生产环境中使用。在生产中,实际的环境变量应该被设置,这样在每次请求时就不需要加载.env文件的开销。这可以通过使用Vagrant、chef或Puppet等工具的自动化部署过程来实现,也可以通过Pagodabox和Heroku等云主机手动设置。
.env文件旨在方便在本地开发环境中更改事物。
phpdotenv包所做的是解析您的.env文件,然后调用putenv()来设置每个环境变量。这设置了$_ENV超级全局变量,您的应用程序可以稍后通过getenv()读取。
使用这里描述的技术,相同的$_ENV超级全局变量使用环境变量设置,并通过相同的getenv()函数提供。不同之处在于您的web服务器或CLI直接设置变量,而不需要解析.env文件。
毫无疑问,这是一个微优化...并且可能不会产生重大的性能差异。但为什么要无端增加开销呢?
这是我一直希望Craft CMS核心以某种形式实现的特性的部分实现:[https://github.com/craftcms/cms/issues/1607](https://github.com/craftcms/cms/issues/1607)添加craft config/cache作为控制台命令
使用Dotenvy
从包含.env和/vendor目录的项目根目录开始,执行以下操作
vendor/bin/dotenvy
如果您使用的是Windows,则执行以下操作
vendor/bin/dotenvy.bat
如果您的.env文件位于其他位置,您可以通过传递目录到.env文件来执行此操作
vendor/bin/dotenvy /path/to/some/dir/
然后**不要**在您的生产环境中创建.env文件,而是通过部署系统粘贴或插入Dotenvy为您生成的结果文件。
这样,Apache服务器、Nginx服务器或CLI将自动注入适当的.env变量。
这意味着不再需要在每次请求上解析.env文件。
更新.gitignore
请确保您在根项目的.gitignore文件中使用如下行来忽略所有.env*文件
.env*
...为确保在生成的 .env*
文件中没有任何秘密被提交到git中。请注意末尾的 *
示例 .env
文件
给定一个看起来是这样的 .env
文件
# The environment Craft is currently running in ('dev', 'staging', 'production', etc.) ENVIRONMENT="local" # The secure key Craft will use for hashing and encrypting data SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7" # The database driver that will be used ('mysql' or 'pgsql') DB_DRIVER="mysql" # The database server name or IP address (usually this is 'localhost' or '127.0.0.1') DB_SERVER="localhost" # The database username to connect with DB_USER="homestead" # The database password to connect with DB_PASSWORD="secret" # The name of the database to select DB_DATABASE="craft3" # The database schema that will be used (PostgreSQL only) DB_SCHEMA="public" # The prefix that should be added to generated table names (only necessary if multiple things are sharing the same database) DB_TABLE_PREFIX="" # The port to connect to the database with. Will default to 5432 for PostgreSQL and 3306 for MySQL. DB_PORT="3306"
以下文件将以与 .env
文件相同的目录输出
Apache .env_apache.txt
将这些粘贴到 <VirtualHost>
块中
# Apache .env variables
# Paste these inside the <VirtualHost> block:
SetEnv ENVIRONMENT "local"
SetEnv SECURITY_KEY "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
SetEnv DB_DRIVER "mysql"
SetEnv DB_SERVER "localhost"
SetEnv DB_USER "homestead"
SetEnv DB_PASSWORD "secret"
SetEnv DB_DATABASE "craft3"
SetEnv DB_SCHEMA "public"
SetEnv DB_TABLE_PREFIX ""
SetEnv DB_PORT "3306"
...或者您可以直接通过以下方式将Dotenvy生成的文件包含到您的Apache conf中
Include /home/forge/SOMEDOMAIN/.env_apache.txt
Nginx .env_nginx.txt
将这些粘贴到 server {}
或 location ~ \.php {}
块中,或在 fastcgi_params
文件中
# Nginx .env variables
# Paste these inside the server {} or location ~ \.php {} block or in the fastcgi_params file:
fastcgi_param ENVIRONMENT "local";
fastcgi_param SECURITY_KEY "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7";
fastcgi_param DB_DRIVER "mysql";
fastcgi_param DB_SERVER "localhost";
fastcgi_param DB_USER "homestead";
fastcgi_param DB_PASSWORD "secret";
fastcgi_param DB_DATABASE "craft3";
fastcgi_param DB_SCHEMA "public";
fastcgi_param DB_TABLE_PREFIX "";
fastcgi_param DB_PORT "3306";
...或者您可以直接通过以下方式将Dotenvy生成的文件包含到您的Nginx conf中
include /home/forge/SOMEDOMAIN/.env_nginx.txt
有关详细信息,请参阅 Nginx-Craft
CLI (Bash shell) .env_cli.txt
将这些粘贴到您 $HOME
目录下的 .bashrc
文件中
# CLI (bash) .env variables # Paste these inside your .bashrc file in your $HOME directory: export ENVIRONMENT="local" export SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7" export DB_DRIVER="mysql" export DB_SERVER="localhost" export DB_USER="homestead" export DB_PASSWORD="secret" export DB_DATABASE="craft3" export DB_SCHEMA="public" export DB_TABLE_PREFIX="" export DB_PORT="3306"
Docker .env_docker.txt
将这些粘贴到您的 Dockerfile
文件中
# Docker .env variables # Paste these into your Dockerfile ENV ENVIRONMENT="local" ENV SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7" ENV DB_DRIVER="mysql" ENV DB_SERVER="localhost" ENV DB_USER="homestead" ENV DB_PASSWORD="secret" ENV DB_DATABASE="craft3" ENV DB_SCHEMA="public" ENV DB_TABLE_PREFIX="" ENV DB_PORT="3306"
Craft CMS CLI
请注意,如果您直接在Apache或Nginx配置中设置 .env
变量,则这些变量将 无法 通过Craft CMS ./craft
CLI命令使用。
这是因为对于CLI请求,web服务器根本不会运行。相反,您需要按照上述说明将它们添加到您的 .bashrc
文件中,或者您可以使用Unix source 命令,例如
source .env_cli.txt && ./craft migrate/all
在上面的示例中,source
命令将执行 .env_cli.txt
中的 export
语句,然后以设置的环境变量运行 ./craft
可执行文件。
如果您在单个实例上运行多个网站,并且通过 .bashrc
为用户全局设置 .env
变量没有意义,这种模式很有用。
Dotenvy 路线图
要完成的事情,以及潜在功能的想法
- 发布
由 nystudio107 提供