为什么要使用环境变量来配置Symfony应用程序?

时间:2018-09-26 18:50:53

标签: php symfony deployment environment-variables

昨天是我第一次使用Symfony 4在自己的服务器上进行部署。阅读关于{em>部署的official documentation,我引用:

  

大多数Symfony应用程序从环境中读取其配置   变量。在本地进行开发时,通常会将它们存储在   .env文件。但是在生产环境中,您无需创建此文件,   应该设置真实的环境变量。

现在,由于我在多个站点上读到了这是生产中正确的工作方式,因此我对此有一些疑问:

  • 生产中环境变量的含义是什么?为什么不只将变量包含在Wordpress,Django和其他文件中?
  • 我为什么要在全局OS变量中拥有项目数据库的凭据?
  • 由于是全局变量,并且可由OS所有人访问,因此如果我有多个具有相同env var的项目(例如,Symfony中的09/27 + 14 days - (weekend of 09/27 week) = 10/12 Tomorrow: 09/27 +1: 09/28 Not Counted: 09/29 (Saturday of this week) Not Counted: 09/30 (Sunday of this week) +2: 10/01 (Here pass for the next workday, and from here can count the weekends after) +3: 10/02 +4: 10/03 +5: 10/04 +6: 10/05 +7: 10/06 (this day is Saturday, can be counted) +8: 10/07 (this day is Sunday, can be counted) +9: 10/08 +10: 10/09 +11: 10/10 +12: 10/11 +13: 10/12 +14 10/13 <- adding the days fall on this date. But, this day is a Saturday, so, comes back to previous workday, which is 10/12 ),更改其值将影响我的所有项目!有道理吗?

如果有人可以稍微介绍一下这个主题,我将非常感激。

对不起我的英语

3 个答案:

答案 0 :(得分:3)

这个问题不太适合SO,但是简单来说:可以为任何环境设置环境变量,而不仅仅是操作系统。例如,像您的Web服务器。我在/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"

可以使用权限保护此文件,以确保只有Web服务器本身才能读取它们。如果我有多个应用程序或虚拟主机,我可以拥有多个文件。

答案 1 :(得分:1)

  

生产中环境变量的含义是什么?为什么不   只是将变量保存在Wordpress,Django等文件中?

首先要了解的是,您的代码可以运行多少个不同的环境。您可能具有生产,暂存,测试和本地环境。在每个文件上都有完全不同的配置文件,由于冲突而无法同步到您的VCS存储库,这真的有意义吗?

您仍然在Symfony和其他框架中有配置文件。但是,某些设置取决于环境,而其他设置则不取决于环境。可以根据环境变量设置依赖于环境的变量。这样,您可以同步配置文件,但仍保留特定于环境的设置。


环境变量不一定是全局变量,这可以解释您的其余担忧。 Web服务器可以在各种上下文中定义环境变量,例如miken32建议在特定虚拟主机中使用SetEnv。

答案 2 :(得分:1)

  

生产中环境变量的含义是什么?为什么不只将变量包含在Wordpress,Django等文件中?

  • 环境变量是在将应用程序从一台服务器移动到另一台服务器时会更改(并且只会更改)的值

  • 这些是该服务器或群集唯一的值,例如服务器的主机名或用于连接数据库的主机名/ IP

您将这些值组合在一起,这些值会一起更改,以便在部署到不同的环境/不同的服务器组(例如测试环境,登台环境/生产环境)时,您的应用会自动调整

  

为什么我要在一个目录中拥有我的项目数据库的凭据   全局OS变量?

如前所述,还有其他设置方法。例如在您的网络服务器中或仅在您的网络服务器的虚拟块中

  

成为全局变量,并且所有操作系统中的人都可以访问,如果我想拥有更多   一个具有相同env var的项目(例如,APP_ENV in   Symfony),更改其值会影响我的所有项目!可以   有道理吗?

是的,因为通常如果将服务器标记为“测试环境”或“ UAT环境”,则在那里部署的所有内容的行为都应该相同(尤其是生产服务器时)。

与每个服务器具有多种用途相比,组织这样的部署和服务器使管理变得容易得多。