在PHP中使用环境变量

构建Docker的php开发环境,编写测试程序的时候,发现php的getenv方法一直都是返回的false,这是因为php-fpm清除了环境变量

验证环境变量是否存在

➜ docker exec -it $containerName env | grep HOSTNAME
HOSTNAME=php  

PHP_FPM的配置

sudo vim /etc/php/php-fpm/php-fpm.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  

在PHP-FPM的配置中默认是清除环境变量,因为考虑到在Docker容器之间的通讯是通过主机名的方式建立通讯,当然也可以写IP地址,但是IP地址每次重启容器都会发生变化,Docker也不建议使用IP地址,所以在Docker的环境中不能清除环境变量,在Docker的容器中环境变量也是非常小的,都是需要用到的环境变量

docker exec dockerphp_php_1 env

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  
HOSTNAME=php  
MYSQL_PASSWORD=node-app  
REDIS_HOST=redis  
MYSQL_DATABASE=node-app  
NGINX_PORT=3000  
MYSQL_ROOT_PASSWORD=node-app  
NODE_ENV=development  
MYSQL_USER=node-app  
DB_HOST=mysql  
APP_PORT=9000  
MONGO_HOST=mongo  
REDIS_CONF=/usr/local/etc/redis/redis.conf  
PHP_HOST=php  
HOME=/root  

在PHP-FPM中还有另一种方传递环境变量到PHP-FPM的进程中,可以选择性使用环境变量

sudo vim /etc/php/php-fpm/php-fpm.d/www.conf  
; 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

如果你使用的Apache

在Apache中的配置

<VirtualHost hostname:80>  
   ...
   SetEnv VARIABLE_NAME variable_value
   ...
</VirtualHost>  

为什么限制对环境变量的访问

在网上没有找到资料,可能是处于安全的考虑,或者考虑到系统环境变量太多的原因

参考链接issues

我的Docker开发环境Github

你的欣赏是我最大的动力

Yanxiong Huang

My name is Yanxiong Huang. graduated from Nanyang middle school.Love Linux,familiar with Node.js,Docker,Serverless... and more Web technology.Contact Me:QQ 31356617;Email:huangaynxiong2013@gmail.com

guangzhou,china http://www.myfreax.com

乐在分享