环境变量和 PHP

2022-08-30 20:37:38

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

当我从命令行使用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进程中?


答案 1

事实证明,您必须在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'

答案 2

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 工作线程中的环境 通过在添加此池配置中指定的 env var 之前清除工作线程中的环境,防止任意环境变量到达 FPM 工作进程。设置为“no”将使所有环境变量都可以通过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讨论中找到了解决方案。


推荐