phpenv global 直接设置系统级默认php cli版本,影响所有新shell会话;需先安装目标版本、确保path和eval "$(phpenv init -)"生效,且其优先级低于shell/local设置。

phpenv global 切换 CLI 默认版本
phpenv 的 global 命令直接修改系统级默认 PHP CLI 版本,影响所有新打开的 shell 会话中执行的 php 命令。它不改 Web 服务(如 PHP-FPM),只管命令行。
执行前先确认目标版本已安装:
phpenv install --list | grep -E "^(7\.|8\.)"
若要设为 PHP 8.1.12:
- 运行
phpenv install 8.1.12(如未安装) - 再执行
phpenv global 8.1.12 - 新开终端或运行
source ~/.bashrc(或~/.zshrc)刷新环境 - 验证:
php -v应输出 8.1.12,且which php指向~/.phpenv/versions/8.1.12/bin/php
注意:phpenv global 不会覆盖当前已激活的 shell 或 local 版本 —— 如果之前执行过 phpenv shell 7.4,当前会话仍用 7.4,直到退出或执行 phpenv shell --unset。
为什么 php -v 没变?常见失效场景
最常遇到的是 PATH 未正确加载或初始化未生效。phpenv 依赖两步:PATH 包含 ~/.phpenv/bin,且 eval "$(phpenv init -)" 已执行。
检查点:
-
echo $PATH是否包含~/.phpenv/bin(不是$HOME/.phpenv/bin的字面路径,要展开) -
type phpenv返回phpenv is a function才说明 init 已生效;若显示not found,说明eval没跑成功 -
phpenv root输出应为/home/youruser/.phpenv;若为空或报错,~/.phpenv可能权限不对或不存在 - 宝塔用户特别注意:面板自带的
/www/server/php下二进制不会被 phpenv 管理,phpenv install装的是独立副本
phpenv local 和 shell 的优先级关系
phpenv 版本选择有明确优先级:shell > local > global。这个顺序决定了实际调用哪个 php。
例如:
- 在项目目录下执行
phpenv local 7.4.33→ 进入该目录后自动用 7.4.33 - 接着执行
phpenv shell 8.0.30→ 当前终端所有php都强制走 8.0.30,不管 cd 到哪 - 此时
phpenv version显示8.0.30 (set by <code>PHPENV_VERSIONenvironment variable) - 退出终端或执行
phpenv shell --unset,就回落到local或global
容易忽略的是:.php-version 文件内容必须是纯版本号(如 7.4.33),不能带 php- 前缀或空格,否则 phpenv local 会静默失败。
切换后 Composer 或 Artisan 报错 extension missing
phpenv 安装的每个 PHP 版本都是干净的独立环境,不继承系统全局扩展。哪怕你用 phpenv global 8.1.12,它默认也不带 curl、mbstring、xml 等常用扩展。
解决方法只有两个:
- 编译时启用:重装时加参数,如
phpenv install --configure-options="--enable-mbstring --with-curl" 8.1.12 - 运行时启用:编辑对应版本的
php.ini(路径由phpenv which php推出,再替换bin/php为etc/php.ini),取消注释或添加extension=mbstring等行
别指望 sudo apt install php8.1-mbstring 能起作用 —— 那装的是系统包管理器的 PHP,和 phpenv 完全无关。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











