envoy部署时composer install卡住,大概率是镜像未在项目级composer.json中正确配置,且未显式传入--no-interaction、--prefer-dist、--no-dev、--optimize-autoloader等关键参数,同时composer_home与缓存路径未正确设置,或composer.lock未随git同步提交。

Envoy部署时composer install卡住,大概率是镜像没配对
Envoy本身不干预Composer行为,但一旦SSH到目标服务器执行composer install,就完全依赖该机器上的Composer配置。如果没显式指定镜像源,它会默认直连packagist.org——国内服务器大概率超时或5–10分钟无响应。
关键不是“能不能用镜像”,而是“镜像配置必须随项目走、不能靠全局”。微服务或CI环境里,全局配置(composer config -g)极易被覆盖或忽略,唯一可靠的是项目级composer.json里的repositories声明。
- 必须在项目根目录的
composer.json中写明镜像,且"packagist.org"键名不能省略、不能写成"packagist"或"default" - 示例正确写法:
"repositories": {"packagist.org": {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}, "my-internal": {...}} - 同时加
{"packagist": false}禁用默认源,否则Composer 2.9+仍可能 fallback 到官方源 - 验证是否生效:在服务器上进项目目录,运行
composer install --dry-run,看日志里Downloading行的URL是否含mirrors.aliyun.com
Envoy任务里必须显式传参,不能只靠composer.json
composer.json里写了镜像,不代表composer install就会快——没加关键参数,照样慢、照样失败。
Envoy执行命令时是纯SSH会话,没有交互终端、没有用户环境变量继承,所有参数都得手动塞进去。
- 必加
--no-interaction:否则卡在license确认或选择提示上,CI直接超时 - 必加
--prefer-dist:跳过git clone,直接下ZIP包,Laravel类库提速2–5倍 - 生产环境必加
--no-dev:否则装phpunit、laravel/pint等,白耗带宽和解压时间 - 必加
--optimize-autoloader:生成autoload_classmap.php,减少运行时文件查找 - 推荐组合:
composer install --no-interaction --prefer-dist --no-dev --optimize-autoloader
COMPOSER_HOME和缓存路径不设对,镜像再快也白搭
镜像地址对了、参数也全了,但composer install还是慢?常见原因是缓存目录不可写,导致每次都要重下包。
尤其用root用户SSH登录时,COMPOSER_HOME默认指向/root/.composer,而PHP-FPM通常以www-data运行,vendor权限错乱后直接500。
- 在Envoy
@task里显式设置环境变量:COMPOSER_HOME=/home/deploy/.composer COMPOSER_CACHE_DIR=/home/deploy/.composer/cache composer install ... - 确保
/home/deploy/.composer目录存在且属主为部署用户(如deploy),权限755 - 别用
sudo composer install:权限污染后,后续所有命令都可能静默失败 - 如果项目用Docker,禁止在
Dockerfile里写RUN composer config -g——容器层配置无法Git追踪,且不同基础镜像路径不一致
Envoy部署前要检查composer.lock是否同步
Envoy不会帮你生成或校验composer.lock。如果Git只提交了composer.json,而服务器上跑composer install,它发现没lock文件,就会自动退化成composer update——网络请求暴增、结果不可控、还可能装错版本。
-
composer.lock必须和composer.json一起提交,且内容需严格匹配 - CI流程里加一行健康检查:
composer validate --strict,失败则中断构建 - 本地开发完后,务必先
git add composer.lock再推送到远端 - Envoy脚本里不要写
composer update上生产——那是开发阶段的事,部署只认lock文件
最易被忽略的一点:镜像配置、参数、缓存路径、lock文件,四者缺一不可。少一个,部署就可能从“慢”变成“挂”。











