我有一个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进程中?
答案 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
码头工人容器中运行nginx
和alpine: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