断网时 composer install 成功的关键是设置 composer_disable_network=1 环境变量,配合 --no-interaction 等参数及完整 vendor/ 和 composer.lock;autoload.php 本身不依赖网络,但需确保其文件存在且未被干扰。

composer install 时加 --no-scripts 和 --no-plugins 不能解决断网问题
断网后 composer install 失败,通常不是因为脚本或插件,而是 Composer 默认会尝试访问 Packagist(或你配置的仓库)校验包元数据、检查更新、下载 zip/tar 包。哪怕 vendor/ 已存在,它仍可能发起网络请求——比如运行 composer dump-autoload 时若检测到 composer.lock 与当前 vendor 不一致,就会试图联网拉取 package info。
真正起效的做法是让 Composer 完全离线运行:
- 确保本地已有完整
vendor/目录和匹配的composer.lock - 运行
composer install --no-interaction --no-progress --no-suggest时,必须同时加--ignore-platform-reqs(避免因 PHP 版本等触发远程校验) - 最关键一步:设置环境变量
COMPOSER_NO_INTERACTION=1+COMPOSER_DISABLE_NETWORK=1,后者才是强制跳过所有网络请求的开关 - 如果用的是 Composer 2.2+,
COMPOSER_DISABLE_NETWORK=1会让install、dump-autoload、show等命令彻底不发 HTTP 请求
如何让 autoload.php 在无网络时稳定加载类
Composer 生成的自动加载逻辑本身不依赖网络——只要 vendor/autoload.php 存在且未损坏,PHP 就能照常加载类。问题往往出在「加载器被意外重写」或「路径硬编码被干扰」。
常见破坏场景和对策:
- 不要在
composer.json的autoload或autoload-dev中使用psr-4映射到网络挂载目录(如 Docker 中的/mnt/nfs/src),断网后文件系统不可达,require会失败 - 避免在
post-autoload-dump脚本里调用外部 API 或执行curl,这类脚本在dump-autoload时运行,而断网下它可能卡住或报错中断加载器生成 - 确认
vendor/composer/autoload_*.php文件没被 Git 忽略或误删——它们是静态映射表,不联网也能工作 - 如果你用了
classmap,记得每次增删类后手动跑composer dump-autoload --classmap-authoritative,生成权威映射,省去运行时文件扫描,也避开因路径不存在导致的 warning
断网环境下 composer update 根本不可行,别试
composer update 必须联网获取最新包信息、比对版本约束、下载新 zip、解压、安装依赖……没有替代方案。强行设 COMPOSER_DISABLE_NETWORK=1 后运行,会直接报错:Could not fetch packages, network is disabled.
所以离线项目必须提前固化依赖:
- 上线前,在有网环境跑一次
composer install --no-dev --optimize-autoloader,并提交composer.lock和完整vendor/(或至少打包好供分发) - CI/CD 流程中禁用
update,只允许install,且检查composer.lock是否被意外修改 - 如果必须支持「有限更新」,可预下载 tarball 到本地镜像源(如 Satis 或 Private Packagist),再配置
repositories指向内网地址,但这仍需一次初始联网同步
PHP 的 include_path 和 Composer 自动加载无关
有人试图改 include_path 让类文件被找到,这完全走偏了。Composer 的 autoload.php 是靠注册 spl_autoload_register() 实现的,它不走 include_path 查找逻辑,而是按 vendor/composer/autoload_psr4.php 里定义的命名空间前缀 + 目录映射来定位文件。
所以:
- 修改
include_path对 Composer 加载器无效 -
get_include_path()返回值变化不会影响new SomeClass()是否成功 - 唯一需要关心的是
vendor/autoload.php本身能否被require到——这就只取决于该文件路径是否正确、权限是否可读
COMPOSER_DISABLE_NETWORK=1 这个环境变量——它不像参数那样显眼,但缺了它,哪怕 vendor 齐全,Composer 仍可能在后台悄悄尝试连外网。










