应降级至 Composer 1.10.22,因其兼容 PHP 5.3–7.4 及旧插件;需卸载当前版本、指定 --version=1.10.22 安装 PHAR,并删除 composer.lock、移除 allow-plugins 字段、调整 auth.json 认证方式。

确认当前 composer 版本并检查是否已安装 2.x
直接运行 composer --version,如果输出类似 Composer version 2.5.8,说明你已在用 2.x。注意:Composer 2.x 默认不兼容 PHP 7.2 及更早版本,但降级主版本的核心动因通常是插件/脚本依赖未适配 2.x 的 API(比如某些私有仓库插件、fxp/composer-asset-plugin 替代方案缺失等)。
常见错误现象:Plugin installation failed, require-dev is empty 或执行 composer install 时卡在「Loading composer repositories」且无响应——这往往是 2.x 在尝试用 HTTPS 请求旧式仓库元数据失败所致。
- 别用
composer self-update --1:该命令在 2.x 中已被移除,会报错Unknown option: --1 - 不要手动删
~/.composer/vendor/composer:Composer 2.x 的核心逻辑已编译进 PHAR,清空 vendor 无效 - 先卸载再装 1.x 是最稳路径,尤其当
which composer指向系统级 PHAR(如/usr/local/bin/composer)时
彻底卸载现有 composer 并下载 1.x 官方 PHAR
Composer 官方明确不支持“就地降级”,必须替换 PHAR 文件。关键点在于:1.x 最后稳定版是 1.10.22(2022 年 10 月发布),它仍支持 PHP 5.3–7.4,且与绝大多数 legacy 插件兼容。
实操步骤:
- 运行
which composer确认安装路径(常见为/usr/local/bin/composer或~/bin/composer) - 用
sudo rm /usr/local/bin/composer(或对应路径)删除当前二进制 - 执行
curl -sS https://getcomposer.org/installer | php下载最新 installer - 运行
php installer --version=1.10.22生成 1.x PHAR(必须显式指定--version,否则默认装 2.x) - 移动并设可执行:
sudo mv composer.phar /usr/local/bin/composer && sudo chmod +x /usr/local/bin/composer
验证:composer --version 应输出 Composer version 1.10.22,且 composer install 能正常解析 repositories 中的 packagist.org 镜像配置(1.x 对镜像 URL 格式更宽松)。
降级后需同步调整的配置和依赖项
Composer 1.x 和 2.x 在 lock 文件格式、依赖解析策略、插件加载机制上有实质差异。不调整可能引发静默失败或行为偏移。
重点检查项:
- 删除项目根目录下的
composer.lock:1.x 无法读取 2.x 生成的 lock 文件(报错Invalid argument supplied for foreach()) - 检查
composer.json中的config段:1.x 不识别allow-plugins字段,若存在需整段删掉,否则会警告并跳过插件加载 - 私有仓库认证方式:1.x 仅支持
auth.json中的http-basic,不支持 2.x 引入的github-oauth或gitlab-token类型,需回退为用户名+密码或 personal access token 填入http-basic - 若用
composer global require装过工具(如laravel/installer),需重新执行——全局 vendor 目录结构在 1.x/2.x 间不兼容
为什么不能长期停留在 1.x?哪些场景真得降级?
Composer 1.x 已于 2022 年 10 月停止维护,官方不再修复安全漏洞(如 CVE-2022-39227)。但如果你的项目满足以下任一条件,降级仍是合理选择:
- PHP 版本 ≤ 7.4 且无法升级(部分企业遗留系统)
- 深度依赖已废弃的插件(如
hirak/prestissimo,其 1.x 分支只兼容 Composer 1) - CI/CD 流水线中某环节硬编码了 1.x 行为(例如解析
composer show --direct输出格式)
容易被忽略的点:某些 Docker 基础镜像(如 php:7.4-cli)内置的 composer 是 2.x,但文档没写清楚;直接 apt install composer 在 Ubuntu 22.04+ 也默认装 2.x。降级操作必须在容器构建阶段完成,不能靠 runtime 覆盖。










