github actions 中 composer install 慢的根本原因是未走国内镜像源,必须用 --repository-url=https://mirrors.aliyun.com/composer/ 显式指定镜像地址并确保末尾有斜杠;同时应缓存 ~/.composer/cache 而非 vendor/,且缓存 key 需包含 php 版本和 composer.lock 哈希。

GitHub Actions 里 composer install 还是慢?根本没走镜像源
90% 的 CI 构建卡在 Downloading xxx.zip,不是网络差,而是命令根本没走国内镜像——composer config -g 在 runner 容器里几乎从不生效,因为每次构建都是全新环境,~/.composer/config.json 是空的或权限受限。别信 composer diagnose 说的 “Repo packagist.org is default”,它只读配置文件,不验证实际请求地址。
必须用 --repository-url 而非全局 config
唯一可靠方式是把镜像地址显式传进命令行:
composer install --repository-url=https://mirrors.aliyun.com/composer/ --no-interaction --prefer-dist --optimize-autoloader- URL 末尾斜杠不能省:
https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(部分 Composer 2.2+ 版本会静默 fallback) - 加
-vvv调试:日志里看到GET https://mirrors.aliyun.com/composer/p2/monolog/monolog.json才算真正走镜像 -
--repository-url是正确参数名,--repository或--repository-url=xxx(等号后无空格)才有效;--repository=https://...是无效写法
缓存 ~/.composer/cache 而不是 vendor/
缓存 vendor/ 看似直接,实则危险:autoloader 文件硬编码绝对路径,CI 每次运行路径不同,导致 Class not found 或 failed to open stream 错误。正确做法是缓存 Composer 自身下载产物:
- 用
actions/cache@v4缓存~/.composer/cache,key 必须含${{ matrix.php-version }}和${{ hashFiles('**/composer.lock') }} - 必须显式设置
COMPOSER_CACHE_DIR=~/.composer/cache,否则 Composer 仍用默认路径,缓存白配 - 顺序不能乱:先
shivammathur/setup-php,再actions/cache,最后composer install - 漏掉
--prefer-dist会触发git clone,而 CI 容器默认无 Git 凭据,报could not read Username
composer.lock 里还记着 github.com?删了重装
镜像源只管元数据,不管 zip 包下载地址。如果 composer.lock 里记录的是 https://api.github.com/,Composer 就会照单下载,无视任何镜像配置:
- 验证方法:
composer install -vvv | grep "Loading composer repositories",输出应含你指定的镜像域名 - 临时补救无效:改完镜像后,必须删掉
composer.lock和vendor/,再跑composer install(不是update) - 项目级配置更稳妥:在
composer.json顶层加"repositories": [{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}],优先级高于全局配置,且对所有执行环境生效
最易被忽略的一点:PHP 小版本升级(比如 8.2.10 → 8.2.12)时,缓存 key 若没包含完整版本号,就会复用旧缓存,导致二进制不兼容——错误往往在 runtime 才暴露,而不是构建阶段。











