【问题标题】:How to set global environment variables for PHP如何为 PHP 设置全局环境变量
【发布时间】:2013-11-10 20:26:21
【问题描述】:

我已阅读问题/答案here,但我不明白如何在 /etc/environment 中设置变量。如果我编辑文件,我需要重新启动我的机器还是简单地注销我当前的用户(或登录一个新用户?)。

我想设置一个全局变量来表示我机器上的网站处于“开发”或“测试”模式。我不想为每个项目都设置这个(无论是使用 PHP、Java/Tomcat、NodeJS 等)。我知道(对于 Apache)我可以通过以下方式设置环境变量:

  1. 直接来自 php 和 putenv()(这似乎没用,因为我想避免试图找出文件在哪个服务器上的逻辑)
  2. 使用 .htaccess SetEnv ENVIRONMENT 'local'(这需要我为每个服务器复制此文件/代码,不理想)
  3. 使用虚拟主机指令SetEnv ENVIRONMENT 'local'(如果我使用的是虚拟主机,几乎在所有情况下我都是,但又需要我一遍又一遍地复制/粘贴代码)
  4. 在 httpd-conf SetEnv ENVIRONMENT 'local' 中(这只适用于 apache,我希望它也适用于 NodeJS 服务器)

我并不是说我不能做 #4(并且有选择地将 #3 应用于 NodeJS 服务器)。但我认为这是使用 /etc/environment 的一个很好的理由。正如我上面所说,我已经编辑了文件(在第一次创建它之后)并尝试了以下组合,但似乎都不起作用:

ENVIRONMENT='local'
ENVIRONMENT=local
export ENVIRONMENT='local'
export ENVIRONMENT=local

我说它们都不起作用,因为我没有在输出中找到变量:

print_r($_SERVER);
print_r($_ENV);
echo(getenv('ENVIRONMENT'));

【问题讨论】:

  • 我遇到了类似的问题,找不到合适的解决方案。问题似乎是您通过控制台看到的环境变量不会保留在服务器上,因此您的应用程序无法使用。如果有人可以就如何持久化这些变量提供建议,那就太好了。 (在部署时设置变量,在运行时读取)

标签: php apache environment-variables


【解决方案1】:

所以我假设你在某处有一个全局配置文件。为什么不在该文件中放置一个可以更改的常量?尝试在服务器级别进行设置会容易得多。

define('ENVIRONMENT', 'testing');
if(ENVIRONMENT == 'testing') {
   echo 'We\'re just testing';
}

【讨论】:

  • 是的,但是该文件在 git 中被跟踪并通过 git 推送到服务器。我可以将该变量放在一个单独的、未跟踪的文件中,但我必须对我所有的本地网站都这样做,这就是为什么我认为这是 /etc/environment 之类的东西的重点,它适用于我的整个环境并且应该可以访问到我机器环境中的所有站点。由于我使用heroku,因此设置环境变量$ heroku config ENVIRONMENT=staging 非常简单,在我的本地机器上也应该同样容易(并且设置是永久的)。
【解决方案2】:

您想要做的是使用 Apache 配置文件。您将需要访问配置文件夹和 httpd.conf 文件(或修改版本)。然后,您可以使用这种方法配置 httpd.conf 以动态加载配置文件

Include conf.d/*.conf

在 conf.d 文件夹中放置特定的环境配置文件。

server-environment-dev.conf 示例:

SetEnv ENVIRONMENT "local"

server-environment-prod.conf 示例:

SetEnv ENVIRONMENT "production"

这些设置将作为可用的环境变量显示在您的 php 代码中。这种方法允许您保持您的 vhost 文件、.htaccess 和其他配置文件与环境无关。

由于某些进程/用户限制,Apache 中的 PHP 无法读取 etc/environment、etc/profile.d、.bash_profile、.profile 等文件。您可以随心所欲地对变量进行 bash、粉碎、崩溃并在终端中查看它们的设置,但除非您通过 Apache 配置文件之一进行设置,否则它们不会显示在 phpinfo() 中。

对于 NodeJS,您可以启动应用程序并传入您的环境变量,或者您可以通过多种方式设置 NODE_ENV,包括您的 .bash_profile 和可能的 etc/environment 文件(如果您想与用户无关)。

Node 的好读物: http://www.hacksparrow.com/running-express-js-in-production-mode.html

【讨论】:

  • 这正是我所需要的。谢谢。
【解决方案3】:

如果您仍然无法获取环境变量:

您可能需要在 real httpd.conf 中编辑

~/库/应用程序支持/appsolute/MAMP PRO/

而不是

/Applications/MAMP/conf/apache/

您可能还需要使用 getenv() 而不是 $_ENV

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2011-02-13
    • 2020-02-15
    • 2015-12-07
    相关资源
    最近更新 更多