如何让 PHP 能够读取系统环境变量

2022-08-31 00:38:06

我在 Centos 上使用 PHP 作为 PHP-FPM。我正在尝试遵循将设置存储在环境变量中的 http://12factor.net/ 准则。

我在/etc/profile.d中创建了一个文件,该文件设置了我想要的环境变量,并且环境变量在通过Bash在CLI中进行测试时出现,即运行bash脚本:

echo $SOME_SERVER_SETTING

显示正确的输出。

我已将clear_env设置为 false,variables_order设置为 ,但是,我设置的变量也不会显示在 PHP 中,也不会在 PHP 中显示EGPCSgetenv('SOME_SERVER_SETTING')var_dump($_ENV)

还需要设置哪些其他设置才能允许 PHP-FPM 接收所有服务器环境变量,特别是通过 Centos 上 /etc/profiles.d 中的 shell 脚本设置的变量?


答案 1

在 Centos 7 上测试,带有 Systemd 服务和 PHP 5.6.4

打开

/etc/php.ini

找到

variables_order = "GPCS"

替换为

variables_order = "EGPCS"
# http://php.net/manual/en/ini.core.php#ini.variables-order

打开

/etc/php-fpm.d/www.conf (maybe /etc/php5/fpm/pool.d/www.conf)
(do not confuse with /etc/php-fpm.conf)

查找是否存在

clear_env = yes

替换或添加

clear_env = no
# http://php.net/manual/en/install.fpm.configuration.php

打开

/etc/environment

#any variables you need, for example:
MY_VAR=1234

在 SHELL 中运行以进行检查

source /etc/environment
echo $MY_VAR # 1234

在 SHELL 中运行

ln -fs /etc/environment /etc/sysconfig/php-fpm
systemctl daemon-reload && service php-fpm restart

...测试

打开

index.php # in your project folder, running with php-fpm

var_dump(getenv('MY_VAR'), $_ENV['MY_VAR']);exit;

在浏览器中运行

http://mylink.to.project/index.php   
string(4) "1234"
string(4) "1234"

享受!


答案 2

安全原因:-)

参见 (debian 位置,在 CentOs 上可能有所不同)/etc/php5/fpm/pool.d/www.conf

; Clear environment in FPM workers
; Prevents arbitrary environment variables from reaching FPM worker processes
; by clearing the environment in workers before env vars specified in this
; pool configuration are added.
; Setting to "no" will make all environment variables available to PHP code
; via getenv(), $_ENV and $_SERVER.
; Default Value: yes
;clear_env = no 

; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
; the current environment.
; Default Value: clean env
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

推荐