composer install 在内网无网络时失败,是因为默认会访问 packagist.org 获取元数据、下载包并校验 dist urls 和 commit hash,dns、https 或证书任一环节中断均导致报错。

composer install 在内网没网络时为什么会失败
因为默认行为会访问 packagist.org(或你配置的仓库)拉取包元数据、下载 ZIP 或通过 Git 克隆,同时还会校验 composer.lock 中记录的 dist URLs 和 commit hash。只要 DNS、HTTPS 连接或证书验证任一环节断开,就会报 Could not fetch、failed to open stream 或 SSL certificate problem。
用 --no-install + 自己提供 vendor/ 目录最稳妥
内网无网络 ≠ 不能复现 install 行为。关键是绕过远程请求,让 composer install 只做「本地解包 + autoload 生成 + 脚本执行」这些不联网的步骤:
- 提前在有网环境跑一次完整
composer install,把整个vendor/目录连同composer.lock一起打包带走 - 内网机器上确保 PHP 环境、扩展(如
openssl、zlib)和源机器一致,否则脚本或 autoloader 可能失败 - 运行
composer install --no-scripts --no-plugins(先禁用不确定行为),再按需补跑composer run-script post-install-cmd - 别依赖
--prefer-source——它会尝试 Git clone,内网没 Git 服务器就卡死
想跳过校验又保留 lock 文件语义?改用 --ignore-platform-reqs + 离线仓库镜像
如果你必须从头跑 install(比如 CI 流水线要验证 lock 文件合法性),但又不能联网,唯一可行路径是预置一个离线 Packagist 镜像(如 satis 或 toran proxy 的导出包),并强制 Composer 只认这个本地源:
- 在
composer.json里写死仓库:"repositories": [ { "type": "composer", "url": "http://your-intranet-mirror/" } ] - 用
composer install --no-interaction --ignore-platform-reqs跳过 PHP 扩展/版本检查(否则常因内网 PHP 少装 ext 报错) - 注意:如果
composer.lock里有 packagist.org 的 dist URL,而你的镜像没同步对应 ZIP,仍会 fallback 失败——必须确保镜像包含 lock 文件里所有dist.shasum对应的归档
为什么 vendor/bin/xxx 执行报错不是网络问题,而是 autoloader 没生效
常见现象:composer install 看似成功,但运行 vendor/bin/phpunit 提示 Class not found。这不是网络导致的,是内网 PHP 没加载 vendor/autoload.php,或者用了 --no-autoloader(极少有人手动加,但某些 CI 模板会埋雷):
- 检查
vendor/autoload.php是否存在且可读;用php -m | grep -i openssl确认必要扩展已启用 - 运行
composer dump-autoload --optimize强制重生成(尤其当你动过autoload配置后) - 别用
php vendor/autoload.php测试——它不执行任何逻辑,要测就跑php -r "require 'vendor/autoload.php'; echo class_exists('PHPUnit\Framework\TestCase') ? 'ok' : 'fail';"
composer install 不报错,但后续脚本或类加载直接崩,而且错误堆栈根本不会提 PHP 版本的事。










