phpenv 的 bin/ 目录存放 phpenv 自身脚本(如 phpenv、phpenv-install),而非 php 二进制;真实 php 解释器位于 versions/ 下各版本子目录中,shims/ 通过动态转发实现无缝版本切换。

phpenv 的 bin/ 目录是命令入口,不是放 PHP 二进制的地方
很多人第一次看到 bin/ 就以为里面存着 php 可执行文件,其实不是。bin/ 只放 phpenv 自身的主脚本和子命令(比如 phpenv-install、phpenv-version),真正的 PHP 解释器在 versions/ 下。如果误删 bin/,整个工具就无法调用。
-
phpenv是 shell 脚本,负责解析命令、读取.version、触发 shim 机制 -
phpenv-rehash必须在安装新 PHP 版本后手动运行,否则php命令仍指向旧版本 - 不要把自定义的 PHP 二进制直接丢进
bin/—— 这会绕过版本管理逻辑,导致phpenv which php返回错误路径
versions/ 是 PHP 真实安装地,每个子目录对应一个完整版本
versions/ 是 phpenv 最关键的数据目录,每个子目录(如 8.3.13、7.4.33)都是独立编译安装的 PHP 完整副本,含 bin/php、lib/php、etc/php.ini 等全套文件。它不共享任何运行时资源,彻底隔离。
- 路径示例:
$HOME/.phpenv/versions/8.3.13/bin/php才是实际执行的解释器 - 删除某个子目录 = 彻底卸载该版本,不会残留配置或扩展
- 如果你用
php-build插件自定义编译,所有 configure 参数(如--with-openssl)都作用于该目录下的构建过程
shims/ 目录是“透明代理”,别手动改里面的内容
shims/ 里全是空壳脚本(如 shims/php、shims/composer),它们本身不干活,只根据当前环境动态转发到 versions/ 下对应版本的真实二进制。这是 phpenv 实现“无缝切换”的核心机制。
- 每次运行
php,实际执行的是shims/php,它再查phpenv version结果,跳转过去 -
phpenv rehash的作用就是重生成这些 shim 脚本——新增版本、删掉旧版、或加了新扩展后必须运行 - 手动生成或编辑
shims/php极易出错:权限不对、shebang 错误、路径硬编码,会导致命令直接报command not found
.version 和 local 设置优先级容易混淆,注意层级覆盖关系
phpenv 按照 shell → local(即当前目录 .php-version)→ global($HOME/.phpenv/version)顺序查找版本,前一级存在就终止搜索。但很多人忽略了 shell 级别的临时设置会覆盖所有其他配置。
-
phpenv shell 5.6.40只影响当前终端会话,关掉终端即失效;适合临时调试老项目 -
phpenv local 7.4.33会在当前目录生成.php-version文件,内容就是纯文本7.4.33,别加空格或注释 - 如果项目根目录有
.php-version,但你在子目录执行phpenv version,它仍返回父目录的版本——phpenv 不递归查找,只认当前目录或向上最近的.php-version
真正容易被忽略的是 shims/ 的缓存行为:哪怕你删了 versions/ 下某个版本,只要没运行 phpenv rehash,shims/php 仍会尝试调用已不存在的路径,报错信息是 No such file or directory,而不是清晰提示“版本未安装”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











