环境变量和PHP

20

我有一个Ubuntu服务器,在/etc/environment中设置了一些自定义环境变量,根据Ubuntu社区的建议

当我使用命令行中的php时,可以使用php的getenv()函数访问这些变量。

另外,如果我从命令行运行phpinfo(),我会在“ENVIRONMENT”部分看到所有的变量。

然而,在尝试访问被php5-fpm运行的进程内相同的数据时,此数据不可用。在phpinfo()的“ENVIRONMENT”部分中,我只能看到:

USER    www-data
HOME    /var/www

我知道命令行使用了这个ini文件:

/etc/php5/cli/php.ini

而 FPM 使用:

/etc/php5/fpm/php.ini
我尚未找到任何能够解释为什么两者都无法传递ENV变量的区别。

另外,如果运行:

sudo su www-data

然后回显我期望的环境变量,确保它们对于www-data用户是可用的。

我需要做什么才能将我的环境变量传递给fpm运行的php进程?


你检查过你的php-fpm进程是否在正确的用户下运行了吗? - outrunthewolf
4个回答

24

事实证明,在php-fpm.conf中必须显式设置ENV变量。

这里是一个例子:

[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm.log

[www]
user = www-data
group = www-data
listen = /var/run/php5-fpm.sock
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
env[MY_ENV_VAR_1] = 'value1'
env[MY_ENV_VAR_2] = 'value2'

1
我有同样的问题。我正在以正确设置环境变量的用户身份运行php-fpm。但是我使用了美元符号将'php-fpm.conf'中的'env[MY_ENV_1]=$MYENV1'进行了设置。但是我无法读取$MYENV1。phpinfo()打印出“没有值”。但是当我在CLI中运行时,我可以读取到正确的值。 - Magic
当我将env[myvariable]放置在/etc/php/7.4/fpm/pool.d/www.conf文件中时,它起作用了。但是在php-fpm.conf文件中不起作用。 - Panu Oksala

15

1. 在php-fpm.conf中自动设置环境变量

clear_env = no


2. 在php-fpm.conf文件中手动设置环境变量

env[MY_ENV_VAR_1] = 'value1'
env[MY_ENV_VAR_2] = 'value2'


! 两种方法都在php-fpm.conf中进行了描述:

清除FPM工作进程中的环境变量,通过在工作进程中清除环境变量来防止任意环境变量到达FPM工作进程,在此池配置中添加环境变量之前。将其设置为“否”将使所有环境变量可通过getenv()、$_ENV和$_SERVER在PHP代码中使用。默认值:是

clear_env = no


传递环境变量,比如LD_LIBRARY_PATH。所有$VARIABLEs都是来自当前环境。默认值:干净的环境。
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

我在这个GitHub讨论中找到了解决方案。

在我的情况中,clear_env选项在php 5.3.10中甚至不存在,但是像你展示的那样设置变量确实有用! - holms
我还要补充一点,如果你的 php-fpm 是由 systemd 启动的,则首先需要指定它获取环境变量的位置。例如,在 /lib/systemd/system/php7.2-fpm.service 中设置 EnvironmentFile=/etc/environment - origaminal
1
env[MYVAR] = $HOSTNAME 对我无效。在 PHP 中,MYVAR 被解析为空,而 'echo $HOSTNAME' 显示一个有效的主机名。有什么想法为什么会这样? - Sagi Mann

1

在上面的回答中,我正在一个alpine:3.8 Docker容器中运行php-fpm7nginx。我遇到的问题是USER myuser的环境变量没有被复制到USER root

我的Docker入口点是

sudo nginx  # Runs nginx as daemon
sudo php-fpm7 -F -O  # Runs php-fpm7 in foreground

这个问题的解决方案是

sudo -E nginx
sudo -E php-fpm7 -F -O

-E选项的sudo会将当前用户的所有环境变量复制到root用户。

当然,您的php-fpm.d/www.conf文件应该有clear_env=no

此外,如果您使用类似于supervisord这样的守护进程服务,则它们有自己的设置来复制环境变量。例如,supervisord有一个名为copy_env=True的设置。


1

问题出在运行php-fpm时,进程没有加载环境变量。
你可以在启动脚本中加载它。
我的php-fpm是通过apt-get安装的。
所以修改

/etc/init.d/php5-fpm

请添加(注意点和斜杠之间的空格)

. /etc/profile

并修改/etc/profile以添加

. /home/user/env.sh

在env.sh中,您可以导出所需的任何环境变量。

然后修改

php-fpm.conf

[www]部分下添加env[MY_ENV_VAR_1] = 'value1'。最后,重新启动php-fpm。这样fpm就会加载环境变量。

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