Зачем мне использовать переменные среды для настройки приложения Symfony?

Вчера я впервые выполнил развертывание на собственном сервере с Symfony 4. Читая официальная документация о развертывание, я цитирую:

Most Symfony applications read their configuration from environment variables. While developing locally, you'll usually store these in a .env file. But on production, instead of creating this file, you should set real environment variables.

Теперь, когда я прочитал на нескольких сайтах, что это правильный способ работы в продакшене, у меня есть несколько сомнений по этому поводу:

  • Что означают переменные среды в производственной среде? Почему бы просто не иметь переменные в файле, таком как Wordpress, Django и другие?
  • Зачем мне нужны учетные данные базы данных моего проекта в глобальной переменной ОС ???
  • Будучи глобальным и доступным для всех в ОС, если бы у меня было несколько проектов с одним и тем же env var (например, APP_ENV в Symfony), изменение его значения повлияло бы на все мои проекты! Есть ли в этом смысл?

Если бы кто-нибудь мог пролить свет на эту тему, я был бы очень признателен.

Извините за мой английский

Несколько хороших ответов ниже. Это может быть неочевидно, но использование переменных env позволит изменять переменные без перестройки кеша Symfony. Полезная возможность в некоторых случаях. Вы всегда можете пойти по старой школе и просто использовать файл parameters.yaml и перестроить кеш, если что-то изменится.

Cerad 26.09.2018 22:24

Конечно! Спасибо!

Genarito 27.09.2018 02:11

Также можно разместить файл .env в производственной системе. Убедитесь, что в окружении нет APP_ENV и т. д., И он будет выбран как локально. Просто никогда не помещайте этот файл в GIT.

mblaettermann 27.09.2018 03:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
397
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Этот вопрос не очень подходит для SO, но вкратце: переменные среды могут быть установлены для любой среды, а не только для операционной системы. Например, как ваш веб-сервер. У меня есть следующее в /etc/httpd/conf.d/variables.conf, которое включено в определенные виртуальные хосты в моей основной конфигурации Apache:

#Config for web apps
SetEnv DB_CONNECTION      "mysql"
SetEnv DB_HOST            "192.168.242.1"
SetEnv DB_USERNAME        "dbuser"
SetEnv DB_PASSWORD        "dbpass"
SetEnv DB_DATABASE        "dbname"

Этот файл можно защитить с помощью разрешений, чтобы гарантировать, что только сам веб-сервер может их прочитать. И у меня может быть несколько файлов, если у меня несколько приложений или виртуальных хостов.

What is the meaning of environment variables in production? Why not just have the variables in a file like Wordpress, Django, and others?

Первое, что нужно понять, это сколько разных сред может запускать ваш код. У вас могут быть производственные, промежуточные, тестовые и локальные среды. Действительно ли имеет смысл иметь совершенно разные файлы конфигурации для каждого, которые не могут быть синхронизированы с вашим репозиторием VCS из-за конфликтов?

У вас все еще есть файлы конфигурации в Symfony и других фреймворках. Однако некоторые настройки зависят от среды, а другие - нет. Те, которые зависят от среды, могут быть установлены из переменных среды. Таким образом, вы можете синхронизировать файлы конфигурации, но при этом сохранять настройки, специфичные для среды.


Остальные ваши опасения можно объяснить тем фактом, что переменные среды не обязательно должны быть глобальными. Веб-серверы могут определять переменные среды в различных контекстах, например, используя SetEnv на определенном виртуальном хосте, как предлагает miken32.

What is the meaning of environment variables in production? Why not just have the variables in a file like Wordpress, Django, and others?

  • переменные среды - это значения, которые изменяются (и изменяются только) при перемещении приложения с одного сервера на другой.

  • это значения, уникальные для этого сервера или этого кластера, например, имя хоста сервера или имя хоста / IP-адрес, который он использует для подключения к базе данных.

вы группируете эти значения, которые меняются вместе, чтобы при развертывании в разных средах / разных группах серверов, таких как среда тестирования, промежуточная среда / производственная среда, ваше приложение автоматически настраивается

Why would I like have the credentials of my project's database in a global OS variable???

как уже было сказано, есть и другие способы установить его. как на вашем веб-сервере или только в виртуальном блоке вашего веб-сервера

Being globals and accessible by all in the OS, if I would have more than one project with the same env var (for instance, APP_ENV in Symfony), changing its value would affect all my projects! Does It make any sense?

Да, потому что обычно, если сервер помечен как «среда тестирования» или «среда UAT», все, что вы там развертываете, должно вести себя одинаково (особенно, если это производственный сервер).

Просто организация развертываний и подобных серверов значительно упрощает управление по сравнению со смешанными целями для каждого сервера.

Другие вопросы по теме