离线环境 autoload 变慢是因为 composer 默认仍尝试访问 packagist.org;需组合使用 --no-plugins、--no-scripts、--no-progress 三参数禁用网络试探,或改用 composer dump-autoload -o --classmap-authoritative 提升性能。

离线环境 autoload 为什么会变慢?
因为 composer install 默认在离线时仍会尝试访问 packagist.org 检查更新、验证哈希或拉取元数据——哪怕你本地有完整 vendor/ 和 composer.lock。Composer 会卡在 DNS 查询或 HTTP 超时上,尤其在 CI 或内网服务器这类无外网但未显式禁用网络的场景。
必须加的三个离线开关
只靠 --no-interaction 或 --prefer-dist 不够,真正起效的是这三个组合:
-
--no-plugins:跳过插件(比如composer/installers的钩子)的远程校验逻辑 -
--no-scripts:防止post-autoload-dump等脚本触发额外网络请求 -
--no-progress:虽不直接影响性能,但能避免某些终端驱动下的阻塞等待
最终命令是:composer install --no-plugins --no-scripts --no-progress。注意:不是 --offline(该参数仅影响依赖解析,不阻止 autoload 生成阶段的网络行为)。
composer dump-autoload 在离线时怎么保性能?
如果只是想刷新 autoload(比如改了类名或加了新文件),不要跑全量 install。直接用 dump-autoload 并加 -o(优化模式)和 --classmap-authoritative:
-
-o启用 classmap 生成,绕过 PSR-4 的文件扫描开销 -
--classmap-authoritative告诉 autoloader:没在 classmap 里的类就一定不存在,不再 fallback 到文件系统遍历 - 两者合用后,
vendor/autoload.php加载速度提升明显,且完全不依赖网络
示例:composer dump-autoload -o --classmap-authoritative
CI/CD 中容易漏掉的两个配置点
很多团队把 vendor/ 缓存了,却忘了 Composer 自身的缓存目录和配置状态也会偷偷联网:
- 删掉
~/.composer/cache/或设COMPOSER_CACHE_DIR=/dev/null,否则它可能尝试刷新 repo 元数据 - 确保
COMPOSER_HOME下没有auth.json里带 token 的配置——某些私仓插件会在 autoload 阶段静默验证 token 有效性
最稳的做法是在构建镜像时,用 composer config --global disable-tls true + composer config --global secure-http false 彻底关闭所有 HTTP 行为(仅限可信离线环境)。











