phpenv只管理php版本切换,不传递运行时环境变量;cli中export的变量php-fpm无法继承,需在nginx、php-fpm或apache中显式配置env参数,或用phpdotenv加载.env文件。

phpenv 本身不管理 PHP 运行时的环境变量(如 PHP_ENV、DB_HOST),它只负责切换不同版本的 php 可执行文件。你要配的是“PHP 应用运行时的环境变量”,不是 phpenv 的环境变量。
为什么 export PHP_ENV=dev 在终端里生效,但 PHP 脚本里 getenv('PHP_ENV') 拿不到?
因为 PHP CLI 和 Web 服务器(如 PHP-FPM、Apache)是两个独立进程,它们继承的环境变量来源不同:
- CLI 下执行
php script.php:能读到你 shell 里export的变量 - Web 请求(Nginx + PHP-FPM):默认不继承系统 shell 环境,
getenv()返回空
解决方法不是改 ~/.bashrc,而是让 PHP-FPM 或 Web 服务器显式传递:
- Nginx 配置中加:
fastcgi_param PHP_ENV "dev"; - PHP-FPM pool 配置中加:
env[PHP_ENV] = dev(然后重启php-fpm) - Apache
.htaccess中加:SetEnv PHP_ENV dev(需mod_env启用)
phpenv global 设置后,php --version 不变?
常见原因是 phpenv init 没生效,或 shell 配置未重载。检查三件事:
- 确认
~/.phpenv/bin在$PATH前端:echo $PATH | grep phpenv - 确认
eval "$(phpenv init -)"已写入~/.zshrc(macOS Catalina+ 默认 zsh)或~/.bashrc,且已执行source ~/.zshrc - 运行
which php—— 如果返回/usr/bin/php或/opt/homebrew/bin/php,说明 shims 没接管;应返回类似/Users/xxx/.phpenv/shims/php
若仍失败,手动触发重哈希:phpenv rehash
项目级 PHP 版本 + 环境变量如何一起固化?
靠两个文件配合,不依赖人工记忆或文档:
- 根目录放
.php-version(内容:如8.2.12),phpenv local自动生成 - 根目录放
.env(内容:PHP_ENV=staging),用vlucas/phpdotenv加载 - 在入口脚本(如
index.php或public/index.php)顶部加载:$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');+$dotenv->load();
⚠️注意:.env 必须加进 .gitignore;部署时由 CI 或运维注入真实值,开发机可保留示例值
为什么改了 ~/.zshrc 还是找不到 phpenv 命令?
最常被忽略的一点:macOS 终端新建窗口默认不读 ~/.zshrc,而是读 ~/.zprofile(尤其 GUI 启动的终端)。验证方式:
- 执行
echo $SHELL确认是/bin/zsh - 执行
ps -p $$看是否为 login shell(带减号) - 如果是 login shell,变量应写进
~/.zprofile;非 login shell 才读~/.zshrc
稳妥做法:把 export PATH 和 eval "$(phpenv init -)" 同时放进 ~/.zprofile,再 source ~/.zprofile
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











