GitHub Actions 中需用 setup-php + php-actions/composer 组合安装 Composer,因 ubuntu-latest 默认不含 Composer;前者装 PHP 及扩展,后者按需下载指定版本二进制、校验配置并自动注入 PATH,避免 apt 安装版本陈旧或扩展缺失问题。

GitHub Actions 里直接写 composer install 会报 Command not found——因为 ubuntu-latest 镜像默认不带 Composer,必须显式安装,且不能靠 apt install composer 敷衍了事。
为什么 setup-php + php-actions/composer 是当前最稳组合
GitHub 官方 setup-php 动作(shivammathur/setup-php@v2)只装 PHP 和扩展,不附带 Composer;而 php-actions/composer@v6 专为 CI 场景设计:它按需下载对应 PHP 版本的 Composer 二进制、跳过全局安装、自动校验 composer.json 格式,并支持指定版本(如 composer-version: '2.5.8')。手动用 curl 装或 apt 装,容易遇到版本陈旧、扩展缺失(比如缺 ext-zip)、与 PHP minor 版本不兼容等问题。
- 别在
run步骤里写sudo apt install composer:Ubuntu 的 apt 包常是 2.0.x,且不保证启用所需扩展 - 如果项目要求 Composer v2.5.8,必须显式传
composer-version参数,否则默认用最新稳定版(可能含破坏性变更) -
php-actions/composer不依赖系统 PATH,它把二进制放在./bin/composer并自动加入环境变量,避免路径冲突
PHP 扩展和版本必须和 composer.json 对齐
常见错误不是 Composer 装不上,而是 composer install 运行时报 Your requirements could not be resolved 或卡在 ext-mbstring missing。这是因为 setup-php 默认不启用任何扩展,而很多包(如 Laravel、Symfony)硬依赖 mbstring、xml、zip、pdo 等。
用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git
-
extensions列表必须手写全:例如mbstring, xml, zip, pdo, pdo_mysql, curl -
php-version必须和composer.json中"php": "^8.1"一致,否则解析器直接拒绝执行 - 若用到
ext-redis或ext-sodium,也得加进extensions,否则测试阶段才爆错,白跑一轮 CI
缓存 vendor 和 ~/.composer/cache 必须同时做
只缓存 vendor/ 目录,下次 composer install 仍要重下所有 ZIP 包;只缓 ~/.composer/cache,则每次还要重新软链接/解压进 vendor/。两者缺一不可,否则省不下几秒。
- 缓存 key 必须包含 OS、PHP 版本、
composer.lock和composer.json的 hash:composer-${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}-${{ hashFiles('**/composer.json') }} - Windows runner 上缓存失败?大概率是路径用了反斜杠或权限问题,优先改用 Linux runner
- 私有 Git 仓库依赖必须提前配置 token:
composer config github-oauth.github.com ${{ secrets.GITHUB_TOKEN }},否则缓存命中后仍因认证失败中断
composer install 参数不能少,尤其 --no-dev
CI 环境不需要 require-dev 里的包(如 PHPUnit、Infection),漏掉 --no-dev 不仅让安装变慢 30%–60%,还会导致缓存体积翻倍、甚至因 dev 包冲突引发 autoload 错误。
- 必加参数:
--no-interaction --prefer-dist --optimize-autoloader --no-dev -
--no-interaction防止某些插件弹出交互提示卡住流程 -
--prefer-dist强制走 ZIP 下载而非 Git clone,更稳定、更快 - 生成 autoload 后建议加一步
php -d display_errors=Off -d error_reporting=0 -f vendor/autoload.php做语法校验,避免composer install成功但测试跑不起来
最容易被忽略的是 PHP minor 版本对二进制扩展的影响:比如 ext-protobuf 编译产物在 PHP 8.1 和 8.2 下不兼容,所以缓存 key 里漏掉 matrix.php-version 会导致 vendor 污染,问题往往在部署后才暴露。

















