如何为PHP设置全局环境变量

aly*_*yda 21 php apache environment-variables

在这里阅读了问题/答案,但我不明白如何在/ 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
Run Code Online (Sandbox Code Playgroud)

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

print_r($_SERVER);
print_r($_ENV);
echo(getenv('ENVIRONMENT'));
Run Code Online (Sandbox Code Playgroud)

nop*_*you 42

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

Include conf.d/*.conf
Run Code Online (Sandbox Code Playgroud)

在conf.d文件夹中,您可以放置​​特定的环境配置文件.

server-environment-dev.conf示例:

SetEnv ENVIRONMENT "local"
Run Code Online (Sandbox Code Playgroud)

server-environment-prod.conf示例:

SetEnv ENVIRONMENT "production"
Run Code Online (Sandbox Code Playgroud)

这些设置将在您的PHP代码中显示为可用的环境变量.此方法允许您使vhost文件,.htaccess和其他配置文件与环境无关.

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

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

对Node的一个很好的解读:http: //www.hacksparrow.com/running-express-js-in-production-mode.html


Mac*_*ity 2

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

define('ENVIRONMENT', 'testing');
if(ENVIRONMENT == 'testing') {
   echo 'We\'re just testing';
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是该文件在 git 中进行跟踪并通过 git 推送到服务器。我可以将该变量放在一个单独的、未跟踪的文件中,但我必须对所有本地网站执行此操作,这就是为什么我认为这就是 /etc/environment 之类的东西的意义,它适用于我的整个环境并且应该可以访问到我的机器环境中的所有站点。由于我使用heroku,因此设置环境变量“$ heroku config ENVIRONMENT=staging”非常简单,在我的本地计算机上设置环境变量应该同样容易(并且设置是永久的)。 (3认同)