根本原因是 composer global require 不读项目配置而只认全局配置和环境变量,需正确配置镜像源、并行下载、强制 dist 并清缓存,再通过 -vvv 实测请求路径验证是否生效。

composer global require为什么卡在 downloading
根本原因不是插件包本身大,而是 composer global require 完全不读项目配置,只认全局配置(~/.composer/config.json)和环境变量。哪怕你刚给某个项目配好阿里云镜像,全局安装依然直连 packagist.org。
- 常见静默失败点:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/少写了中间的composer类型参数,或 URL 末尾漏掉/,命令不报错但实际没写进去 - 用
sudo执行过配置?那它写进了/root/.composer/config.json,而composer global require是当前用户运行,读的是$HOME/.composer/config.json - PHP 禁用了
putenv()(见php.ini中disable_functions),导致config -g写配置失败却不提示
全局插件安装必须配齐的三项配置
光换镜像不够,global require 默认不开并发、不强制 dist、不跳过 dev 包——这些都得手动开:
- 镜像源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 并行下载(Composer 2.2+):
composer config -g parallel-downloads 10(设 10 是多数机器合理上限;若报file_put_contents(/tmp/): failed to open stream,降为 6) - 强制 dist:
composer config -g prefer-dist true - 执行完立刻
composer clear-cache—— 否则旧缓存里的元数据仍指向packagist.org,请求根本不发出去
验证全局镜像是否真正生效
别只信 composer config -g repo.packagist 的输出,要实测网络请求路径:
- 先清缓存:
composer clear-cache - 执行:
composer global require monolog/monolog -vvv 2>&1 | grep "Downloading\|packages.json" - 看到
Downloading https://mirrors.aliyun.com/composer/packages.json才算真生效;若仍是https://packagist.org/packages.json,说明配置没落地
CI/CD 中装全局插件最省时间的组合
部署阶段别用默认参数——autoload、脚本、dev 依赖全拉,浪费大量 I/O 和 CPU。推荐直接写:
COMPOSER_NO_PLUGINS=1 composer global require --no-dev --prefer-dist --no-autoloader --no-scripts monolog/monolog
-
COMPOSER_NO_PLUGINS=1跳过插件加载逻辑(不影响插件本身安装,只跳过激活时的远程请求或文件扫描) -
--no-dev避免拉取插件的 dev 依赖(比如 phpunit、phpstan) -
--prefer-dist强制走 ZIP,避免 clone 源码仓库 -
--no-autoloader和--no-scripts省掉 autoload 生成和脚本执行环节,装完再补
复杂点在于:全局配置容易被权限、缓存、PHP 环境三重干扰,每次配完必须实测请求路径,不能只看 config 输出。











