You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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服务:
    sudo systemctl restart php7.2-fpm
    
    这时php-fpm启动时就会加载到这个环境变量,你原来在www.conf里的env[DB_CONNECTION] = $DB_CONNECTION就能正常生效了。

方法二:让php-fpm服务加载指定的环境变量文件

如果不想把变量放到系统级,想单独存在用户目录里,可以修改php-fpm的systemd服务配置:

  • 找到php-fpm的systemd服务文件,通常路径是/lib/systemd/system/php7.2-fpm.service
  • 编辑这个文件,在[Service]区块下添加一行(注意替换成你的实际用户路径):
    EnvironmentFile=/home/your_username/.env
    
    建议把环境变量从/.bashrc里移到单独的`~/.env`文件里,避免加载/.bashrc里那些针对交互式shell的冗余配置,~/.env里只放:
    DB_CONNECTION="connection_string"
    
  • 重新加载systemd配置并重启php-fpm:
    sudo systemctl daemon-reload
    sudo systemctl restart php7.2-fpm
    

方法三:直接在php-fpm配置里硬编码(临时应急用)

你已经试过这种方法能生效,但如果想避免硬编码,还是优先上面两种方法。不过如果是测试环境临时用,硬编码也没问题。

验证方法

重启php-fpm后,你可以通过两种方式验证:

  1. 在服务器终端执行:
    php -r 'var_dump(getenv("DB_CONNECTION"));'
    
  2. 访问你的PHP页面,运行<?php var_dump(getenv('DB_CONNECTION'));,应该能正常输出string(17) "connection_string"了。

内容的提问来源于stack exchange,提问作者Doctor Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:21:50