Автоматически загружает переменные среды из .env
в getenv()
, $_ENV
и $_SERVER
.
Никогда не следует хранить конфиденциальные учетные данные в своем коде . Хранение конфигурации в среде — один из принципов двенадцатифакторного приложения. Все, что может измениться в разных средах развертывания, например учетные данные базы данных или учетные данные для сторонних служб, должно быть извлечено из кода в переменные среды.
По сути, файл .env
— это простой способ загрузить пользовательские переменные конфигурации, необходимые вашему приложению, без необходимости изменять файлы .htaccess или виртуальные хосты Apache/nginx. Это означает, что вам не придется редактировать какие-либо файлы вне проекта, и все переменные среды всегда устанавливаются независимо от того, как вы запускаете свой проект — Apache, Nginx, CLI и даже встроенный веб-сервер PHP. Это НАМНОГО проще, чем все другие известные вам способы установки переменных среды, и вам это понравится!
php_value
в файлы .htaccess.PHP dotenv — это PHP-версия оригинального Ruby dotenv.
Установка очень проста через 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
для создания более настраиваемого репозитория:
$ 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 ();
Возможно, вам потребуется убедиться, что переменная имеет логическую форму, принимающую значения «истина», «ложь», «Вкл», «1», «Да», «Выкл», «0» и «Нет». Вы можете сделать следующее:
$ 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
. Если эти переменные не установлены, просмотрите variables_order
в файле php.ini
. См. php.net/manual/en/ini.core.php#ini.variables-order.
Если вы обнаружите уязвимость безопасности в этом пакете, отправьте электронное письмо по адресу [email protected]. Все уязвимости безопасности будут оперативно устранены. Вы можете ознакомиться с нашей полной политикой безопасности здесь.
PHP dotenv распространяется под лицензией BSD из 3 пунктов.
Доступно как часть подписки Tidelift.
Разработчики vlucas/phpdotenv
и тысяч других пакетов сотрудничают с Tidelift, чтобы обеспечить коммерческую поддержку и обслуживание зависимостей с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом специалистам по сопровождению именно тех зависимостей, которые вы используете. Узнать больше.