命令行工具
phpenv/phpenv avatar
phpenv/phpenv

phpenv 评测:用 rbenv 的思路管理多个 PHP 版本

简单的 PHP 版本管理。有没有想过为什么不能在自己的开发机器上运行 PHP 应用程序?

1,870 个 Star143 个 ForkShellMIT
GitHub

秒懂

它是什么?
phpenv 是一个受 rbenv 启发的 PHP 版本管理工具,通过目录级 .php-version 文件切换解释器。它本身不编译 PHP,需要配合 php-build 插件,适合需要精确控制构建选项的开发者。
适合谁用?
phpenv 适合那些需要同时维护多个 PHP 项目、且对解释器构建参数有精确要求的开发者。它不适合追求开箱即用的新手,因为安装后必须额外安装 php-build 插件才能编译任何 PHP 版本,而且每次安装新版本后都要手动执行 phpenv rehash 重建 shim。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 47 天前。
用什么语言写的?
主要是 Shell(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

它解决什么问题,谁需要它

开发机上的 PHP 版本经常和线上环境不一致,这是很多 PHP 开发者头疼的事。phpenv 的思路来自 rbenv:在 PATH 中插入一层 shim,当你在某个项目目录里执行 php 命令时,它会读取该目录下的 .php-version 文件,然后调用 ~/.phpenv/versions 下对应版本的二进制。这个机制让不同项目可以各自锁定自己的 PHP 版本,切换目录即切换解释器。适用对象是那些需要同时维护多个 PHP 项目、且每个项目依赖不同 PHP 版本的开发者。如果你只是写一个简单脚本,用系统自带的 PHP 就够了,phpenv 反而增加了一层间接调用。

实际机制:shim、目录切换与插件

phpenv 的运作分三步。安装时它把自己注入 PATH,之后任何 php、php-fpm 相关命令都会先经过 phpenv。接着它扫描当前目录找 .php-version 文件,如果找到,就用文件里写的版本号去 ~/.phpenv/versions 下找对应的安装目录。每个版本目录都是一个完整的 PHP 安装,包含自己的 php、php-fpm、pecl、pyrus 和 php.ini。phpenv 找到版本后直接调用该目录下的可执行文件。这种设计的好处是版本之间完全隔离,互不影响。但注意,phpenv 本身不负责编译 PHP,它只负责切换。编译工作由 php-build 插件完成,phpenv 通过 plugins 机制调用它。README 里明确说,几乎所有机制都可以用 bash 写的插件自定义,这意味着扩展灵活,但也意味着调试插件时需要 bash 功底。

安装与配置:命令和关键步骤

安装有两种方式。macOS 或 Linux 上可以用 Homebrew,执行 brew install phpenv/tap/phpenv,然后往 shell 配置里加一行 eval "$(phpenv init -)"。手动安装则分四步:先 git clone https://github.com/phpenv/phpenv.git ~/.phpenv,再把 ~/.phpenv/bin 加到 PATH,接着加 init 行,最后 exec $SHELL -l 重启 shell。关键的一步是安装 php-build 插件,命令是 git clone https://github.com/php-build/php-build $(phpenv root)/plugins/php-build。之后才能用 phpenv install <php-version> 编译指定版本。每次安装新 PHP 后,需要手动执行 phpenv rehash 重建 shim 二进制,这一步容易忘记,但 README 里明确提醒了。选择项目版本用 phpenv local 8.3.13,它会更新当前目录的 .php-version 文件。配置编译选项时,通过环境变量 PHP_BUILD_CONFIGURE_OPTS 和 PHP_BUILD_INSTALL_EXTENSION 来控制。

与 php-build 的分工和配置边界

phpenv 和 php-build 是两套独立工具,phpenv 负责运行时切换,php-build 负责编译。php-build 编译 PHP 时使用三层配置:它自己的默认 configure 选项、每个版本定义文件里的选项、以及环境变量里的额外选项。这意味着你可以在 PHP_BUILD_CONFIGURE_OPTS 里加自定义参数,在 PHP_BUILD_INSTALL_EXTENSION 里加扩展。这种分工让 phpenv 保持轻量,但代价是用户必须理解 php-build 的配置体系。如果你只想装一个官方预编译的 PHP,php-build 的编译模型会显得繁琐,因为它总是从源码编译,耗时且依赖系统库。README 里也提到,php-build 有默认配置选项的文档链接,但具体哪些选项是默认的,需要去 php-build 的仓库查。

Web 服务器接入:php-fpm 与 Apache 模块

phpenv 编译出的每个 PHP 版本都自带 php-fpm,配置文件在 ~/.phpenv/versions/$VERSION/etc/php-fpm.conf,默认监听 localhost:9000。启动方式有几种:直接用 init 脚本、安装 systemd 服务单元、或者手动运行 php-fpm 并加参数。README 里给了三种启动路径,但没细说 systemd 单元的具体内容。另一种方式是让 Apache 直接加载 libphp.so 模块,前提是 php-build 编译时带上了 apache 扩展,编译产物放在 ~/.phpenv/versions/$VERSION/libexec 下。对于生产环境,php-fpm 是推荐方式,因为 PHP 进程以调用者身份运行,而不是以 web 服务器身份,这降低了权限风险。但要注意,php-fpm 的配置需要你自己调整,默认只监听本机 9000 端口,跨机器部署时要改监听地址。

局限性与不适用场景

phpenv 最大的局限是它不解决编译依赖问题。你在 macOS 或 Linux 上编译 PHP 之前,必须手动安装所有系统库,比如 libxml、openssl 之类,README 里没有列出这些依赖,只能去 php-build 的文档找。另一个问题是 rehash 机制:每次安装新版本后都要手动运行 phpenv rehash,如果忘记,新版本的 shim 可能不会生效,导致命令还是指向旧版本。还有,phpenv 只管理 PATH 中的可执行文件,不涉及 Composer 或其他 PHP 工具的版本管理,那些工具的版本需要你自己处理。对于 Docker 用户来说,phpenv 的本地编译模型显得多余,因为容器镜像本身就能隔离 PHP 版本,不需要在宿主机上维护多个编译产物。

替代方案:与 phpenv 的思路差异

一个直接的替代是 php-version,它也是一个 PHP 版本管理工具,但实现方式不同。php-version 通过修改 PATH 环境变量来切换当前 shell 的 PHP 版本,而不是像 phpenv 那样按目录自动切换。这意味着 php-version 更简单,适合单一项目或手动切换的场景,但无法做到 cd 到不同目录时自动选择版本。另一个替代是 Docker,用不同镜像跑不同 PHP 版本,完全隔离环境,但需要容器编排,且文件系统映射和端口管理更复杂。phpenv 的优势在于它保留了宿主机的原生进程模型,php-fpm 可以直接被 web 服务器连接,不需要网络代理。如果你的需求是多个项目同时存在且各自锁定版本,phpenv 的目录级切换机制更顺手;如果只是偶尔换版本,php-version 的学习成本更低。

维护与升级成本

phpenv 的升级方式是 git pull,因为它是通过 git clone 安装的,所以升级就是拉取最新代码。但 php-build 插件是独立仓库,需要单独更新,否则可能无法编译最新 PHP 版本。每个 PHP 版本编译一次耗时较长,而且一旦系统库升级,旧版本可能需要重新编译才能继续工作。许可证是 MIT,可以自由使用和修改,但注意 phpenv 和 php-build 是不同项目,许可证可能不同,使用时需要分别确认。维护成本主要在于:你需要同时关注 phpenv 和 php-build 两个仓库的更新,以及每次系统升级后检查编译环境是否仍然有效。

编辑结论

phpenv 适合那些需要同时维护多个 PHP 项目、且对解释器构建参数有精确要求的开发者。它不适合追求开箱即用的新手,因为安装后必须额外安装 php-build 插件才能编译任何 PHP 版本,而且每次安装新版本后都要手动执行 phpenv rehash 重建 shim。在采用前,你应当先确认自己的操作系统能否满足 php-build 的编译依赖,并检查 ~/.phpenv/versions 目录下是否已有现成的 PHP 安装可供复用。如果你只需要快速切换系统包管理器提供的 PHP 版本,phpenv 的编译模型会显得过重,此时直接使用系统包或 Docker 镜像可能更省事。

官方来源

  1. Official README
  2. Project repository
  3. Release notes
社区笔记

社区笔记