如何使Apache可以使用环境变量作为服务启动?

时间:2018-02-09 08:01:06

标签: php apache environment-variables

我知道向/etc/environment添加一些环境变量会使它们在系统范围内可用,将它们添加到/etc/profile~/.bashrc或等效的,将提供给特定用户。然而,所有这些都适用于交互式会话。当Apache作为systemd服务启动时,它是一个非交互式会话,因此它不会看到这些环境变量。我可以让Apache解析.env文件,其中包含

等行
env1=foo
env2=bar
...

然后可以使用$_SERVER['foo']等在我的PHP代码中访问它们。当然,我也想为其他systemd服务实现相同的目标,所以是否有任何特定的文件为服务提供env变量?

3 个答案:

答案 0 :(得分:1)

您可以使用站点的Apache配置文件中的SetEnv指令为该站点设置环境变量,如下所示:

SetEnv DATABASE_NAME foo

这需要进入<VirtualHost>指令。

重新启动服务器后,可以通过$_ENV超全局或getenv()访问此数据。这种方法的缺点是,如果您的应用程序包含Apache不执行的任何操作,例如队列工作程序或控制台命令,它将无法访问相同的变量,除非您在适当的位置复制它们地方(例如你的.bashrc)。

或者您可以使用DotEnv等库。

答案 1 :(得分:0)

您可以在auto_prepend_file指令中使用VirtualHost让PHP在每次请求之前包含文件:

<VirtualHost *:80>
ServerName myserver.com
DocumentRoot /path/to/doc/root/

php_value auto_prepend_file "/path/to/my/env_settings.php"

</VirtualHost>

'env_settings.php'可以包含任何有效的php,因此您应该能够设置任何您想要的变量,并使它们在全局范围内可用。

答案 2 :(得分:0)

Apache有源envvars文件,默认情况下位于$prefix/bin/envvars。 Debian将它放在/etc/apache2目录下。在此文件中,您可以在httpd进程启动之前修改环境,例如。 export env1=foo

当Apache作为服务自动启动或使用envvars命令启动时,通常会解释

apachectl,而不是直接调用httpd时。因此,如果您依赖envvars中设置的环境变量,请确保在拥有自制启动脚本的情况下包含它。