phpenv global/local/shell 可切换php版本,但仅影响cli;web服务需单独配置,且安装后必须执行phpenv rehash才能生效。

直接用 phpenv global 或 phpenv local 就能改,不需要动系统软链接、不碰 Nginx 配置、也不用重启 Web 服务——前提是 PHP 版本已安装好。如果你执行后 php -v 没变,大概率是没装目标版本,或者 shell 初始化没生效。
确认目标版本是否已安装
phpenv 不会自动下载或编译 PHP,它只管理你手动安装好的版本。运行:
phpenv versions
如果输出里没有你要的版本(比如 8.1.28),那下一步不是“切换”,而是“先装”。常见漏掉的环节:
- 忘了装
php-build插件,导致phpenv install命令不存在 - 系统缺编译依赖,如
libxml2-dev、libssl-dev、autoconf,安装中途报错但被忽略 - 用了国内镜像源但未配置,下载
php-src超时失败,命令看似结束实则没装成
global / local / shell 切换的区别和陷阱
三者优先级是:shell > local > global。容易出问题的是:
-
phpenv local 8.2.12会在当前目录生成.php-version文件,但如果你在子目录执行php -v,它依然生效——因为 phpenv 会逐级向上查找该文件,直到根目录或找到为止 -
phpenv shell 8.0.30是临时的,新开一个终端就失效;但很多人误以为它会持久化,结果在另一个 tab 里查phpenv version发现还是旧版本 -
phpenv global system并不是切回系统默认 PHP,而是让 phpenv “退出接管”,把控制权交还给系统 PATH 里的第一个php——这可能是/usr/bin/php,也可能是宝塔装的某个版本,行为不确定
为什么 php -v 变了,但 phpinfo() 还是旧版本?
CLI(命令行)和 Web 服务器(如 Apache/Nginx)用的是两套 PHP 执行环境。phpenv 只影响 CLI 的 php 命令,对 Web 请求完全无感。你看到 php -v 是 8.3,但浏览器打开 phpinfo() 显示 7.4,说明:
- Nginx 的
fastcgi_pass仍指向php7.4-fpm.sock - Apache 的
LoadModule加载的还是旧版libphp7.so - 宝塔面板里网站设置的 PHP 版本没同步更新(即使你本地用 phpenv 切了,面板不认)
Web 环境要单独配,和 phpenv 无关。
装完版本后必须执行 rehash
每次运行 phpenv install 后,必须立刻执行:
phpenv rehash
否则 phpenv versions 里看不到新版本,phpenv global 也会报 “no such version”。这是因为 phpenv 用 shim 机制拦截命令调用,而 shim 文件是在 rehash 时生成的。跳过这步等于装了却没注册,就像买了钥匙但没插进锁孔。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











