环境变量和PHP

时间:2013-03-15 09:34:38

标签: environment-variables php

我有一个ubuntu服务器,根据ubuntu community recommendation

在/ etc / environment中设置了一些自定义环境

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

另外,如果我从命令行运行phpinfo(),我会看到环境部分中的所有变量。

但是:

当尝试访问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 个答案:

答案 0 :(得分:23)

事实证明你必须在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 :(得分:13)

<强> 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工作进程的变量   在此池中指定的env变量之前的工作线程中的环境   配置已添加。设置为“no”将构成所有环境   通过getenv(),$ _ENV和$ _SERVER可用于PHP代码的变量。   默认值:是

clear_env = no


  

传递LD_LIBRARY_PATH之类的环境变量。所有$ VARIABLE都是   取自当前的环境。默认值:clean env

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp


我在github discussion找到了解决方案。

答案 2 :(得分:1)

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

  

/etc/init.d/php5-fpm

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

  

。的/ etc /简档

并修改/ etc / profile以添加

  

。 /home/user/env.sh

在env.sh中。无论您需要什么,都可以export环境。

然后修改

  

PHP-fpm.conf

env[MY_ENV_VAR_1] = 'value1'部分下添加[www] 持续。重启php-fpm。您将通过fpm获得环境负载。

答案 3 :(得分:0)

加上以上答案,我正在php-fpm7码头工人容器中运行nginxalpine:3.8。我面临的问题是USER myuser的env变量没有被复制到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
sudo的

-E选项将当前用户的所有env变量复制到根目录

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

还有,仅供参考,如果您使用的是supervisord之类的守护程序,则它们具有自己的设置来复制环境。例如,supervisord的设置称为copy_env=True