GitHub Actions中直接运行composer install必然失败,因ubuntu-latest镜像默认无PHP和Composer;必须组合shivammathur/setup-php@v2(装PHP及扩展)与php-actions/composer@v6(下载校验Composer二进制并注入PATH),并同步缓存~/.composer/cache和vendor/、严格对齐PHP版本与扩展、配置GitHub Token及超时参数。

GitHub Actions 里直接写 composer install 必然失败
不是配置错,是根本不存在——ubuntu-latest 镜像默认不带 PHP,更没有 composer。你看到的 “Command not found” 或 “PHP is not installed” 都是表象,根因是环境空白。
必须组合两个动作:shivammathur/setup-php@v2 装 PHP 及扩展,php-actions/composer@v6 按需下载校验对应版本的 composer 二进制并注入 PATH。二者缺一不可:
-
setup-php不装 Composer,只负责 PHP 版本 + 显式声明的扩展(如mbstring,xml,zip,pdo,curl) -
php-actions/composer不依赖系统 PATH,把二进制放./bin/composer并自动 prepend 进环境变量,避免和系统残留冲突 - 别用
sudo apt install composer:Ubuntu 官方源常是过时的 2.0.x,且不保证启用ext-zip等 Laravel/Symfony 硬依赖
composer.json 中 PHP 版本与 setup-php 必须严格对齐
如果 composer.json 写 "php": "^8.1",但 GitHub Actions 中用了 php-version: '8.2',Composer 解析器会直接拒绝执行,报错类似 Your requirements could not be resolved。
扩展列表也得手写全,不能靠“默认”:
- 主流框架硬依赖
mbstring,xml,zip,pdo,curl - 项目若用
ext-redis或ext-sodium,必须加进extensions参数,否则测试阶段才爆错,白跑一轮 CI -
setup-php默认不启用任何扩展,显式声明是唯一可靠方式
缓存 vendor/ 和 ~/.composer/cache 必须同时做
只缓存 vendor/,下次 composer install 仍要重下 ZIP 包;只缓存 ~/.composer/cache,则每次还要重新解压、软链进 vendor/。两者缺一不可。
缓存 key 要含三要素:composer.lock 哈希、PHP 版本、Composer 版本。例如:
composer-${{ hashFiles('**/composer.lock') }}-${{ matrix.php-version }}-${{ env.COMPOSER_VERSION }}
CI 中建议通过 env 设置 COMPOSER_VERSION,再在 php-actions/composer 中用 composer-version 参数对齐。
拉取 GitHub 依赖超时?四步必须同步生效
超时本质是默认配置在低响应场景下全面失效——单改一个参数没用,必须四步齐上:
- 先配 GitHub Token:
composer config --global github-oauth.github.com,然后立刻chmod 600 ~/.composer/auth.json(权限不是 600,Composer 会静默忽略) - 提高全局超时:
COMPOSER_PROCESS_TIMEOUT=600(单位秒),比composer config -g process-timeout 600更稳,尤其在容器中 - 禁用并行:
COMPOSER_DISABLE_PARALLEL=true,并确保use-include-path为false - 换国内镜像源(仅加速 packagist.org 元数据和 .zip):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
私有 GitHub 仓库还得多一步:在 composer.json 的 repositories 里,URL 必须是 https://github.com/xxx/yyy.git 格式,且 "type": "vcs" 显式声明,否则认证逻辑不触发。











