我知道向/etc/environment
添加一些环境变量会使它们在系统范围内可用,将它们添加到/etc/profile
,~/.bashrc
或等效的,将提供给特定用户。然而,所有这些都适用于交互式会话。当Apache作为systemd
服务启动时,它是一个非交互式会话,因此它不会看到这些环境变量。我可以让Apache解析.env
文件,其中包含
env1=foo
env2=bar
...
然后可以使用$_SERVER['foo']
等在我的PHP代码中访问它们。当然,我也想为其他systemd
服务实现相同的目标,所以是否有任何特定的文件为服务提供env变量?
答案 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
envvars
命令启动时,通常会解释 apachectl
,而不是直接调用httpd
时。因此,如果您依赖envvars
中设置的环境变量,请确保在拥有自制启动脚本的情况下包含它。