Когда вы создаете новое приложение (даже если это обычный веб-сайт), рано или поздно встает вопрос деплоя, или простым языком переноса на боевой сервер, на котором, скорее всего отличается некоторый набор параметров. Например:
- Настройки подключения к базе данных
- Доменное имя
Очевидно, что в программном коде ваших подмодулей и составляющих, где вы обращаетесь к этим значениям, удобно использоваеть некоторую переменную, вместо того, чтобы явно указывать значение. То есть, вместо:
$connection = new DbConnection('vasya', 'superStrongPassword');
Написать что-то вроде такого:
$connection = new DbConnection($config->user, $config->password);
Детали и особенности обращения к переменной конфигурации могут отличаться, в зависимости от реализации, фреймворка и подхода разработчика, но суть остается той же: заменить явное использование значения на конфигуриремую переменную.
А сама переменная $config где-то в момент запуска приложения будет наполняться значениями, которые хранятся в конфигурационном файле.
Как хранить настройки приложения
Любой уважающий себя разработчик, хранит код в git-репозитории, в том числе и файл(-ы) конфигурации. Но хранит не совсем ту конфигурацию, которая используются на локальном или боевом сервере, а всего лишь пример конфигурации (так называемую sample-конфигурацию), наполненной либо значениям по-умолчанию, либо какими-то тестовыми значениями, которые необходимо заменить на свои.
Выглядеть этот файл конфигурации может так:
<?php
return [
'domain' => 'example.com',
'username' => 'example',
'password' => 'pleaseСhangeMe',
'dbtype' => 'mysql',
'dbserver' => 'localhost',
//... и так далее
];
Хранится такой файл наряду с другими конфигурационными файлами различных подмодулей в каталоге config (так, например, устроено в Laravel и некоторых других фреймворках).
Суммарное количество настроек во всех файлах конфигурации может достигать несколько сотен. Деплой такого проекта может значительно затянуться из-за просмотра большого числа настроек и их редактирования.
Чаще всего при деплое нужно поменять не все настройки, а только лишь некоторый ограниченный набор. Для этого на помощь приходят файлы окружения.
Файлы окружения — это такие же файлы настроек, но с некоторыми особенностями
Настройки окружения (.env)
По сути, файлы настроек окружения — это такие же файлы настроек, но:
- во-первых, файл окружения, как правило не хранят в git-репозитории (а хранят как пример example-файл)
- во-вторых, в этот файл выносят ограниченный набор настроек, с которыми вы чаще всего будете работать
- в-третьих, в этом файле чаще всего содержатся именно те настройки, которые нужно поменять при переносе на другой сервер — это могут быть флаги отключения отладочного режима, ключи доступа к API, настройки почты и так далее — все то, что на локальном сервере имеет другие значения
При этом в самом файле конфигурации (не окружения) мы можем обратиться к настройке окружения и задать при этом значение по-умолчанию на тот случай, если запрашиваемой настройки нет в файле окружения:
<?php
return [
'domain' => env('APP_DOMAIN', 'example.com'),
'username' => env('DB_USERNAME'),
'password' => env('DB_PASSWORD'),
'dbtype' => env('DB_TYPE', 'mysql'),
'dbserver' => env('DB_SERVER', 'localhost'),
];
При этом файл настроек окружения (в Laravel) лежит в корневом каталоге проекта, называется .env и выглядит примерно так:
APP_DOMAIN=mywebsite.com
DB_USERNAME=vasya
DB_PASSWORD=myStrongPassword
DB_SERVER=localhost
Резюме
Файлы настроек окружения содержат относительно узкий набор часто меняемых настроек и настроек, которые зависят от рабочей станции (или, если правильнее — от окружения), а файлы настроек содержат весь набор варьируемых параметров, от которых зависит работа приложения или его подмодулей, среди которых есть те параметры:
- которые чаще всего работают "из коробки"
- которые нужно изменить всего один раз и они будут иметь одинаковые значения вне зависимости от окружения (сервера)
- которые транслируются из настроек окружения.
Удачи в веб-разработке. Задавай вопросы в комментариях, подписывайся на Youtube-канал Lectoria и обязательно подписывайся на наши соцсети: Instagram, VK, Facebook.
Вы должны авторизоваться, чтобы оставлять комментарии.