Symfony 4,.env文件和制作

时间:2018-03-09 08:37:30

标签: php symfony nginx environment-variables symfony4

.env文件非常方便docker,kubernetes等

但是如果我有简单的nginx服务器没有任何编排和一包cron worker和一包守护进程(systemd / supervisord / etc)怎么办? 我可以将这些env变量写入nginx服务器部分,但我必须为每个cron worker或daemon设置数百个env变量。

我找到了一个快速解决方案:在生产中使用symfony / dotenv组件 但在我看来很脏。谁可以建议更好的解决方案?

2 个答案:

答案 0 :(得分:10)

首先,并非所有变量都需要使用环境变量来指定。在单独的yaml文件中保留每个系统不同的变量。

如果每个服务器只有一个环境,则可以在/etc/environment中全局指定环境变量。 (根据你的Linux风格可能会有所不同)

就我个人而言,当我在同一台服务器上运行多个环境时,我发现使用DotEnv比解决方案带来的困难更多。在这种情况下,在/etc/environment这样的全局配置中指定变量并不起作用。

在nginx中指定环境变量并不是解决方案,因为正如你所提到的,他们不会被cron,主管,控制台等接听。对我来说,这就是完全的理由删除DotEnv并再次使用旧的parameters.yaml文件。没有什么能阻止你这样做。

然而,另一个解决方案是在开发环境中继续使用DotEnv,并在生产中包含单独的parameters.yaml。然后,您可以按如下方式定义环境变量:

parameters:
  env(APP_ENV): prod
  env(APP_SECRET): 3d05afda019ed4e3faaf936e3ce393ba
  ...

包含此文件的方法是将以下内容放在services.yaml文件中:

imports:
    - { resource: parameters.yaml, ignore_errors: true }

这样,当没有parameters.yaml文件存在时,将忽略导入。另一个解决方案是在内核类中向configureContainer()添加一行:

$loader->load($confDir.'/parameters'.self::CONFIG_EXTS, 'glob');

答案 1 :(得分:2)

如果要集中cli和fpm的环境变量,可以在系统中定义一次。然后在php-fpm.conf

中引用它们
....
[www]
env[APP_VAR1] = $APP_VAR1
env[APP_VAR2] = $APP_VAR2
...

通过这种方式,您可以避免在最佳实践鼓励的生产中使用DotEnv。

希望这有帮助。