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

29

我已经阅读了这里的问题/答案,但我不明白如何在/etc/environment中设置变量。如果我编辑该文件,我需要重新启动计算机还是仅注销当前用户(或登录新用户)?

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

  1. 直接从php中使用putenv()(由于我要避免试图确定文件在哪台服务器上,所以这似乎没用)
  2. 使用.htaccess SetEnv ENVIRONMENT 'local'(这将要求我为每个服务器复制此文件/代码,不理想)
  3. 使用Virtual Host指令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'));

我遇到了类似的问题,但找不到合适的解决方案。问题似乎是您通过控制台看到的环境变量在服务器上不会持久存在,因此您的应用程序无法使用它们。如果有人能够提供如何持久化这些变量的建议,那将非常好。(在部署时设置变量,在运行时读取) - PepeNietnagel
3个回答

53

你需要做的是使用 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代码中。该方法使您可以将您的虚拟主机文件、.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


1
这正是我需要的。谢谢。 - mason81
@nopuck4you 谢谢你,但对我来说仍然不起作用。 - ratna
你能帮我解决这个问题吗?https://stackoverflow.com/questions/71356831/how-to-change-user-home-path-in-rhel-8 - ratna

2

那么我假设你有一个全局配置文件。为什么不在该文件中放置一个常量,以便您可以更改它?这样比尝试在服务器级别设置某些内容要容易得多。

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

3
是的,但是那个文件被Git跟踪并通过Git推送到服务器。我可以将该变量放在一个单独的、未跟踪的文件中,但我必须为所有本地网站都这样做,这就是为什么我认为像/etc/environment这样的东西是我的整个环境,并且应该可以访问我的机器环境下的所有站点。由于我使用Heroku,设置环境变量$ heroku config ENVIRONMENT=staging非常简单,应该在我的本地机器上同样容易(并使设置永久化)。 - alyda

0
如果您仍然无法获取环境变量:
您可能需要编辑以下位置的 real httpd.conf 文件:

~/Library/Application Support/appsolute/MAMP PRO/

而不是

/Applications/MAMP/conf/apache/

此外,您可能需要使用 getenv() 而不是 $_ENV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接