根本原因是phpEnv未将PHP路径写入系统PATH,导致CMD找不到php.exe,进而无法执行composer.phar;需手动激活版本、验证php -v、将composer.bat所在目录加入PATH,并启用zip扩展、配置国内镜像与内存限制。

Windows 下用 phpEnv 管理 PHP 环境时,Composer 很容易装不上、调不动——根本原因不是 Composer 本身有问题,而是 phpEnv 的 PHP 路径没被系统识别,或者你把 composer.phar 放错了位置。
为什么 phpEnv + Composer 总是报“不是内部或外部命令”
phpEnv 默认不修改系统 PATH,它只是把多个 PHP 版本隔离放在自己的目录里(比如 C:\phpenv\versions\8.2.12\)。你运行 composer --version 失败,90% 是因为 CMD/PowerShell 根本找不到 php.exe,更别说调用 composer.phar 了。
- 先验证 PHP 是否可用:在新打开的 CMD 中执行
php -v,如果报错,说明 phpEnv 没激活当前版本,或没把 PHP 加进 PATH - phpEnv 激活命令是
phpenv local 8.2.12或phpenv global 8.2.12,但这个只影响 phpEnv 内部逻辑,不会自动推送到系统环境变量 - 即使你手动加了 phpEnv 的 bin 目录到 PATH,也得确认该目录下真有
php.exe—— 有些精简版 phpEnv 安装包压根不带 CLI 可执行文件
正确安装 Composer 到 phpEnv 环境中
别用官方 Composer-Setup.exe,它会绕过 phpEnv 自己找 PHP,很可能绑定到 XAMPP 或旧版 PHP 上。直接用 phpEnv 当前激活的 PHP 手动装:
- 确保已通过
phpenv global 8.2.12指定了版本,并在新 CMD 中验证php -v成功 - 下载
composer.phar到固定路径,例如C:\phpenv\composer\(不要放 phpEnv 的版本子目录里) - 在同目录新建
composer.bat,内容为:@echo off<br>php "%~dp0composer.phar" %*
- 把
C:\phpenv\composer\加进系统 PATH(不是composer.phar文件路径!) - 新开 CMD,运行
composer --version;若失败,再跑where php看是否指向 phpEnv 的 PHP
ext-zip 报错:phpEnv 下 Composer install 卡住或提示 missing zip extension
phpEnv 自带的 PHP ZIP 扩展默认是关闭的,而 Composer 2.x 强依赖 ext-zip 解压包。光开 extension=zip 不够,还得确认 DLL 文件存在且匹配 PHP 架构。
立即学习“PHP免费学习笔记(深入)”;
- 找到当前 phpEnv 版本的
php.ini(通常在C:\phpenv\versions\8.2.12\下) - 取消注释
extension=zip,并确认C:\phpenv\versions\8.2.12\ext\php_zip.dll确实存在 - 如果不存在,去 windows.php.net 下载对应 PHP 版本、线程安全(TS)和架构(x64/x86)的完整二进制包,从中提取
php_zip.dll放入 ext 目录 - 重启 CMD,运行
php -m | findstr zip验证扩展已加载 - 再试
composer install,如果还报错,加-vvv看具体卡在哪一步
镜像源和内存限制这些细节不能漏
phpEnv 环境下 Composer 默认走国外源,加上 PHP 内存限制低,composer update 极易 OOM 或超时。
- 设国内镜像(全局):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 提高内存上限(临时):
php -d memory_limit=-1 C:\phpenv\composer\composer.phar update - 或设环境变量(推荐):
set COMPOSER_MEMORY_LIMIT=-1,然后所有composer命令都生效 - 别信 php.ini 里的
memory_limit,Composer 启动时可能绕过它,必须显式传参或设COMPOSER_MEMORY_LIMIT
最常被忽略的一点:每次切换 phpEnv 版本后,要重新验证 php -v 和 composer --version,因为 PATH 里的 PHP 路径可能没跟着变;bat 包装器里的 php 调用是靠系统 PATH 查找的,不是硬编码路径。



















