背景:
一个运行在 PHP 7.2.34 的老项目,需要引入aws/aws-sdk-php,在 Composer 2.x 环境下经历了一系列失败,最终成功安装 3.288.1。
本文记录完整排障过程与最终正确解法。
一、环境背景
基础环境
PHP: 7.2.34
Composer: 2.9.2
OS: CentOS / RHEL 7Composer 镜像
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.org"
}
}二、最初的问题:aws/aws-sdk-php 无法安装
尝试安装:
composer require aws/aws-sdk-php:3.199.3错误信息(核心):
found aws/aws-sdk-php[3.199.3] but these were not loaded,
because they are affected by security advisories尝试过的方案(全部失败)
--no-audit"audit": { "block-insecure": false }- 忽略 PHP 版本
- 降级 / 固定版本
- Composer 自降级
结论
**在 Composer 2.6+ + Packagist 环境下,
aws/aws-sdk-php 某些旧版本已经被仓库层“强制封禁”,无法通过任何参数绕过。**
三、选择可行版本:3.288.1
改用一个 PHP 7.2 可用,且未被封禁 的版本:
composer require aws/aws-sdk-php:3.288.1却遇到了新的错误:
aws/aws-sdk-php 3.288.1 requires guzzlehttp/promises ^1.4.0 || ^2.0
but the package is fixed to v1.3.1 (lock file version)四、真正的坑:Composer 的 Partial Update + Lock 文件
问题本质
- 项目中
guzzlehttp/promises被锁死在 1.3.1 - AWS SDK 要求
>= 1.4.0 - 使用了 部分更新(partial update)
- Composer 不允许隐式修改已锁定依赖
错误提示里这句是关键:
the package is fixed to v1.3.1 (lock file version) by a partial update五、正确解法(关键步骤)
最终成功命令
composer update aws/aws-sdk-php guzzlehttp/promises --with-all-dependencies或等价写法:
composer require aws/aws-sdk-php:3.288.1 -W-W / --with-all-dependencies 的含义
允许 Composer:
- 升级
- 降级
- 移除
当前
composer.lock中的相关依赖
六、推荐的依赖组合(PHP 7.2 / 7.3)
"require": {
"aws/aws-sdk-php": "3.288.1",
"guzzlehttp/guzzle": "^6.5.8 || ^7.5",
"guzzlehttp/psr7": "^1.9 || ^2.4",
"guzzlehttp/promises": "^1.5 || ^2.0"
}七、经验总结(非常重要)
1️⃣ Composer 装不上包,不一定是版本不兼容
可能是:
- 仓库级封禁
- 安全 advisory
- lock 文件锁死
2️⃣ composer require 默认是“部分更新”
不会动 lock 里的其它包
需要显式加:
-W3️⃣ 老项目升级依赖的正确姿势
- 不要死磕最新版
- 选择 “生态可接受”的最后可用版本
- 控制升级范围
- 一步一步来
八、最终结论
**在 PHP 7.2 + Composer 2.x 环境下,
成功安装 aws/aws-sdk-php 的关键不是版本号本身,
而是正确处理 Composer 的依赖锁与更新策略。**
九、附:最终成功命令(备忘)
composer update aws/aws-sdk-php guzzlehttp/promises --with-all-dependencies