在PHP的实际开发场景中,环境变量常被用来存储数据库配置、接口密钥等敏感信息,避免配置硬编码到代码里。但很多开发者在使用PHP FPM时,会发现即使系统层面已经设置了环境变量,PHP代码里通过getenv或者$_ENV都无法获取到对应的值,这往往和FPM的clear_env配置有关。

PHP读取环境变量的常用方式
PHP中读取环境变量主要有两种常用方式,分别是getenv()函数和全局数组$_ENV,两种方式的用法示例如下:
<?php
// 使用getenv函数读取环境变量
$dbHost = getenv('DB_HOST');
// 使用$_ENV数组读取环境变量
$dbUser = $_ENV['DB_USER'];
echo "数据库主机:{$dbHost},数据库用户:{$dbUser}";
?>
FPM中clear_env参数的作用
PHP FPM的配置文件(通常是php-fpm.conf或者对应池的www.conf)里有一个clear_env参数,这个参数的默认值是yes,作用是控制FPM启动的子进程是否清理从父进程继承来的环境变量。当clear_env设置为yes时,FPM会清空大部分继承的环境变量,只保留少数必要的变量,这就导致我们在系统层面设置的环境变量无法被PHP进程读取到。
如果我们将clear_env设置为no,FPM就不会清理继承的环境变量,PHP进程就可以正常读取到系统层面设置的环境变量了。
修改FPM配置开启clear_env = no的步骤
修改配置的具体步骤如下:
- 找到PHP FPM的配置文件,一般路径是/etc/php/版本/fpm/pool.d/www.conf,不同系统路径可能略有差异
- 打开配置文件,搜索clear_env参数,默认情况下可能是被注释的,值为yes
- 去掉注释,将值修改为no,修改后的配置如下:
; 清除环境变量,默认是yes,设置为no保留继承的环境变量 clear_env = no
- 保存配置文件后,重启PHP FPM服务使配置生效,重启命令根据系统不同可能是systemctl restart php-fpm或者service php-fpm restart
配置生效后的验证方法
配置修改完成后,可以通过简单的PHP脚本验证环境变量是否可以被正常读取,验证脚本如下:
<?php
// 先设置一个系统环境变量,比如在终端执行 export TEST_ENV=hello_php
// 执行脚本查看是否能读取到
$testEnv = getenv('TEST_ENV');
if ($testEnv) {
echo "成功读取到环境变量TEST_ENV,值为:{$testEnv}";
} else {
echo "未读取到环境变量TEST_ENV";
}
?>
将脚本放到web目录访问,或者在命令行通过php 文件名.php执行,如果输出成功读取到环境变量,说明配置已经生效。
注意事项
开启clear_env = no之后,虽然解决了环境变量读取的问题,但也要注意不要在生产环境暴露不必要的环境变量,避免敏感信息泄露。另外如果使用的是Docker等容器环境,环境变量的设置方式可能和直接在系统层面设置不同,需要对应调整容器的环境变量配置,再配合clear_env参数的修改,才能保证PHP正常读取到环境变量。