composer不支持直接配置项目专属镜像,正确方式是在composer.json的config.repositories.packagist中设置镜像url,或使用全局命令composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/。

如何用 Composer 的 COMPOSER_REPO 和本地仓库模拟包下载失败
Composer 本身不提供“弱网”或“包损坏”开关,但可以通过拦截包源路径,人为制造网络异常或返回损坏文件。关键在于绕过 Packagist 默认源,改用可控的本地 HTTP 服务(如 Python 的 http.server 或 nginx)作为镜像源。
实操建议:
- 在
composer.json中设置"repositories"指向本地地址,例如{"type": "composer", "url": "http://localhost:8000"} - 用 Python 启动一个监听端口的服务:
python3 -m http.server 8000,然后在对应目录下放伪造的packages.json和dist归档 - 故意把某个
.zip文件末尾截断几个字节,或返回 HTTP 500/408 状态码,就能触发 Composer 的重试与校验失败逻辑
composer install 时如何强制触发 checksum 验证失败
Composer 在安装时默认校验 dist.sha256 或 dist.sha1,但只有启用 --prefer-dist 且包有 dist 字段才会走这一步。若想验证校验失败行为,不能只改文件内容——必须让 Composer 下载到篡改后的归档,且不跳过校验。
实操建议:
- 确保
composer install --prefer-dist执行(而非--prefer-source) - 在本地仓库的
packages.json中保留"dist": {"sha256": "..."}字段,但提供一个 SHA 不匹配的 ZIP 文件 - 删掉
vendor/和composer.lock,避免缓存干扰;加上-v参数查看详细错误:Invalid checksum for ... expected ..., calculated ...
用 COMPOSER_HOME + 自定义 ca-bundle.crt 模拟 TLS 中断
弱网测试不止是丢包,也包括 TLS 握手失败、证书过期等场景。Composer 使用系统的 cURL 或 PHP 的 OpenSSL,可通过替换 CA 证书强制触发 SSL 错误。
实操建议:
- 设置
COMPOSER_HOME=/tmp/composer-test,避免污染全局配置 - 在该目录下新建
ca-bundle.crt,内容为空或仅含一个无效证书 - 执行
composer config -g cafile /tmp/composer-test/ca-bundle.crt(注意:这是全局配置,所以必须用独立COMPOSER_HOME) - 此时
composer update会报错:cURL error 60: SSL certificate problem: unable to get local issuer certificate
为什么不能直接用 tc 或 netem 对 Composer 进程限速
因为 Composer 大量使用 PHP 的 stream_context_create() 和 cURL,默认不走系统 socket 层的透明代理,tc 对单个 CLI 进程的流量整形效果不稳定,容易被 DNS 缓存、HTTP/2 多路复用或 Composer 内部重试掩盖。
更可靠的做法是控制源头:
- 用
nginx配置limit_rate和error_page 404 = @slow,再在@slow中加return 503或延迟响应 - 或改用
mitmproxy拦截请求,对特定 URL 返回慢响应或截断 body - 记住:Composer 的健壮性测试重点不是“多慢”,而是“是否重试”“是否回退到 source”“是否清理临时文件”,这些行为只在源可控时才能稳定复现
真正难测的不是超时,而是部分下载后磁盘满、临时文件权限丢失、或 composer.lock 被写到一半时中断——这些得靠信号中断(kill -STOP)配合 strace 观察文件操作点。











