phpenv global 设置的是当前用户已初始化 shell 会话下的默认 PHP 版本,仅对执行过 eval "$(phpenv init -)" 的 shell 生效,不作用于系统级或未加载配置的终端;它在无本地 .php-version 文件时生效,但会被项目级设置、PATH 优先级及未正确加载 shim 机制覆盖。

phpenv global 命令到底设的是什么
它设置的是「当前用户 shell 会话下的默认 PHP 版本」,不是系统级全局,也不是所有终端共享——只对执行过 eval "$(phpenv init -)" 的 shell 生效。这个版本会在你没进入任何设置了 phpenv local 的项目目录时自动激活。
常见误解是以为设了 phpenv global 8.3.13 就能一劳永逸覆盖所有场景,其实它会被以下情况绕过:
- 当前目录存在
.php-version文件(由phpenv local生成) - PATH 中有其他 PHP 二进制路径排在
~/.phpenv/shims/php前面(比如系统自带的/usr/bin/php或 Docker 容器里的路径) - shell 没有重新加载配置,或初始化脚本未正确执行(尤其 zsh 用户常漏掉
~/.zshrc里补全逻辑)
为什么 php -v 还是旧版本
最常踩的坑:which php 返回的不是 ~/.phpenv/shims/php,而是别的路径。这说明 phpenv 的 shim 机制根本没接管命令查找链。
检查步骤:
立即学习“PHP免费学习笔记(深入)”;
- 运行
echo $PATH,确认~/.phpenv/bin和~/.phpenv/shims都在最前面(顺序很重要) - 确认
~/.phpenv/shims目录存在且非空(若为空,说明phpenv rehash没执行或失败) - 执行
phpenv rehash强制重建 shims(安装新版本后必须做,切换 global 后也建议做) - 重启终端或运行
source ~/.bashrc(或对应 shell 配置文件)
如何让 global 设置真正“全局”一点
所谓“更全局”,其实是让尽可能多的上下文尊重这个设置。关键不在 phpenv 本身,而在环境变量和启动方式:
- 确保
~/.phpenv/shims在所有 shell 配置文件(~/.bashrc、~/.zshrc、甚至~/.profile)中都加入 PATH - 避免在 Web 服务器(如 Nginx/Apache)配置里硬编码
php-cgi路径;改用phpenv exec php-cgi或通过fastcgi_param PHP_VALUE间接控制 - CI/CD 脚本里别依赖 shell 初始化,显式调用
phpenv global 8.3.13 && phpenv rehash再跑测试 - 如果用 VS Code 终端,检查它的 shell 是 bash 还是 zsh,并确保对应配置文件已生效(有时 GUI 应用不读
~/.bashrc)
PHP 环境变量(如 APP_ENV)和 phpenv global 是两回事
phpenv global 只管 PHP 解释器版本,不管应用层环境变量。像 APP_ENV=production 或 PHP_ENV=test 这类变量需单独设置:
- 临时设置:
APP_ENV=production php index.php - 会话级持久:
export APP_ENV=development(加到~/.bashrc可延续) - Web 服务传递:Nginx 中写
fastcgi_param APP_ENV $app_env;,再用map指令根据 host 或其他条件赋值 - 框架内读取:
getenv('APP_ENV')或$_SERVER['APP_ENV'],但注意 CLI 和 FPM 下可用性不同
容易忽略的是:Web 服务器子进程通常不继承你的 shell 环境变量,所以不能只靠 export 就指望网页里 getenv() 能拿到。



















