20

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

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

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

但是,当尝试访问由 php5-fpm 运行的进程内的相同数据时,此数据不可用。我可以在环境部分看到的phpinfo()是:

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 进程?

4

4 回答 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'
于 2013-04-05T08:39:00.497 回答
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 工作程序进程。设置为“no”将使 PHP 代码可以通过 getenv()、$_ENV 和 $_SERVER 使用所有环境变量。默认值:是

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 讨论中找到了解决方案。

于 2016-02-29T20:24:30.910 回答
1

问题是当你运行 php-fpm 时。该进程未加载环境。
您可以在启动脚本中加载它。
我的 php-fpm 是由 apt-get 安装的。
所以修改

/etc/init.d/php5-fpm

并添加(注意点和斜线之间的空格)

. /etc/profile

并修改 /etc/profile 添加

. /home/user/env.sh

在 env.sh 中。您可以export根据需要设置环境。

然后修改

php-fpm.conf

env[MY_ENV_VAR_1] = 'value1' 在该[www]部分下添加。
最后的。重新启动 php-fpm。您将通过 fpm 获得环境负载。

于 2014-04-16T01:10:37.860 回答
1

除了上面的答案之外,我还在php-fpm7一个nginxdockeralpine:3.8容器中运行。我面临的问题是 env 变量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

-Esudo 选项将当前用户的所有环境变量复制到根目录

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

仅供参考,如果您使用的是守护程序服务,例如supervisord他们有自己的设置来复制环境。例如,supervisord有设置称为copy_env=True

于 2019-11-28T05:23:36.617 回答