如何让php-fpm读取系统环境变量?(Nginx+php-fpm+Yii场景)
解决php-fpm无法读取~/.bashrc中环境变量的问题
这问题我之前部署项目时也踩过坑,核心原因很简单:**php-fpm是作为系统服务启动的,根本不会加载你用户目录下/.bashrc里的环境变量**——因为/.bashrc只有在交互式bash会话(比如你ssh登录、打开终端)时才会被加载,而php-fpm的启动进程和你的用户bash会话完全是两个独立的环境,所以你在www.conf里写的env[DB_CONNECTION] = $DB_CONNECTION,这个$DB_CONNECTION在php-fpm启动时的环境里是空的,自然读不到值。
下面给你几个靠谱的解决办法,按推荐程度排序:
方法一:把环境变量放到系统级配置文件中
这是最稳妥的方式,因为系统级环境变量会被所有服务进程加载:
- 编辑系统环境配置文件
/etc/environment,添加一行:
或者在DB_CONNECTION="connection_string"/etc/profile.d/目录下新建一个专门的环境变量文件,比如db_env.sh,内容写:export DB_CONNECTION="connection_string" - 保存后重启php-fpm服务:
这时php-fpm启动时就会加载到这个环境变量,你原来在sudo systemctl restart php7.2-fpmwww.conf里的env[DB_CONNECTION] = $DB_CONNECTION就能正常生效了。
方法二:让php-fpm服务加载指定的环境变量文件
如果不想把变量放到系统级,想单独存在用户目录里,可以修改php-fpm的systemd服务配置:
- 找到php-fpm的systemd服务文件,通常路径是
/lib/systemd/system/php7.2-fpm.service - 编辑这个文件,在
[Service]区块下添加一行(注意替换成你的实际用户路径):
建议把环境变量从/.bashrc里移到单独的`~/.env`文件里,避免加载/.bashrc里那些针对交互式shell的冗余配置,EnvironmentFile=/home/your_username/.env~/.env里只放:DB_CONNECTION="connection_string" - 重新加载systemd配置并重启php-fpm:
sudo systemctl daemon-reload sudo systemctl restart php7.2-fpm
方法三:直接在php-fpm配置里硬编码(临时应急用)
你已经试过这种方法能生效,但如果想避免硬编码,还是优先上面两种方法。不过如果是测试环境临时用,硬编码也没问题。
验证方法
重启php-fpm后,你可以通过两种方式验证:
- 在服务器终端执行:
php -r 'var_dump(getenv("DB_CONNECTION"));' - 访问你的PHP页面,运行
<?php var_dump(getenv('DB_CONNECTION'));,应该能正常输出string(17) "connection_string"了。
内容的提问来源于stack exchange,提问作者Doctor Coder
相关产品推荐
相关产品推荐

