验证镜像源是否真正生效,必须执行composer config -g repo.packagist并输出完整json对象如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};空、null、纯字符串或官方源url均无效,常见原因包括键名拼错(如repos.packagist)、url缺末尾斜杠、未加-g参数或用户配置路径不一致。

确认镜像源是否真正生效
执行 composer config -g repo.packagist,输出必须是完整 JSON 对象,例如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。空、null、纯 URL 字符串(如 "https://mirrors.aliyun.com/composer/")或仍是 https://packagist.org,都说明没生效。
常见静默失败原因:
-
repos.packagist(多一个s)——字段名拼错,Composer 不报错但忽略 - 旧版 Composer 1.x 不支持
repo.packagist,得用composer config -g repos.packagist '{"type":"composer","url":""}' - CI 脚本里用了
sudo composer config -g,写进了root的配置,但 runner 是普通用户,读不到 - URL 缺末尾斜杠(如
https://mirrors.tuna.tsinghua.edu.cn/composer→ 必须是https://mirrors.tuna.tsinghua.edu.cn/composer/)
验证是否真走镜像:加 -vvv 运行 composer install,日志中出现 GET https://mirrors.aliyun.com/composer/p2/ 才算成功。
缓存目录必须挂载到高速本地盘
cache-dir 指向 NFS、Docker volume 或慢速磁盘,缓存就等于没用。默认缓存路径在 $COMPOSER_HOME/cache(Linux/macOS)或 %APPDATA%\Composer\Cache(Windows),但 CI 容器生命周期短,需显式指定并挂载。
推荐做法:
- 设为本地 SSD 路径,例如
composer config -g cache-dir "/tmp/composer-cache" - CI 中用环境变量更可靠:
COMPOSER_CACHE_DIR=$HOME/.composer-cache-$PHP_VERSION,避免多 PHP 版本混用 - GitLab CI 示例:
paths: - ~/.composer-cache-8.2;GitHub Actions 推荐用actions/cache@v4,path精确到~/.composer/cache/files
注意:~/.composer/cache/files 是实际存放 zip 包的位置,只缓存 vendor/ 或只缓存顶层 ~/.composer/cache 都不完整——前者跳过包复用,后者仍要重复解压校验。
CI 中 composer install 必须带的参数组合
漏掉任意一个,缓存就白配:
-
--no-dev:跳过require-dev,省掉 30%–60% 时间 -
--prefer-dist:强制走 tarball 安装,比--prefer-source更快更稳定;即使某包没 dist,Composer 也会自动 fallback,不用怕 -
--optimize-autoloader(或-o):生成vendor/composer/autoload_classmap.php,把 PSR-4 映射转成静态查找表 -
--no-interaction:CI 没终端,不加会卡在 auth token 输入环节
这些参数不是可选优化,而是 CI 场景下保证缓存命中、避免交互阻塞、控制安装行为的底线要求。
classmap-authoritative 和 apcu-autoloader 别乱开
两者都属于生产级 autoload 优化,但适用场景不同,且不能共存:
-
--classmap-authoritative(或-a)告诉自动加载器:“类不在 classmap 就不存在”,彻底跳过 PSR-4 文件扫描。适合无运行时类生成的项目,否则可能报Class not found -
--apcu-autoloader依赖apcu.so扩展,缓存类查找结果,保留动态加载能力。需确保apc.enable_cli=0(CLI 下禁用 APCu),否则composer install会失败
开发环境别开这两个——新增类不会被自动识别;composer dump-autoload --optimize --classmap-authoritative 这种命令只应在构建后、上线前执行一次,而不是每次 install 都跑。











