断网时需提前在联网机下载校验 composer.phar 并拷贝至目标机,加执行权限或建软链接;运行 composer install 必须配合完整 composer.lock 和 vendor 目录,并加 --no-plugins --no-scripts 参数禁用联网行为。

断网环境下无法运行 curl 或访问 getcomposer.org
断网时,常规的在线安装方式(如 curl -sS https://getcomposer.org/installer | php)会直接失败,报错类似 Connection refused 或 Failed to open stream: no suitable wrapper。这不是权限或 PHP 配置问题,而是网络请求根本发不出去。
核心思路是:把 composer.phar 这个可执行文件提前下载好,带进断网环境,再做本地安装或直接使用。
- 必须在有网机器上下载最新稳定版
composer.phar(不是 Windows Installer,也不是源码包) - 推荐从官方镜像或可信离线源获取,例如:
https://install.phpcomposer.com/composer.phar(阿里云镜像,国内可用) - 下载后校验 SHA384 哈希值(官方页面提供),避免文件损坏或被篡改
- 把
composer.phar文件复制到目标断网机器的任意目录(如/opt/composer/或C:\tools\)
怎么让 composer 命令在断网机器上全局可用
断网机器上没有网络,就不能用 php composer-setup.php 这类依赖远程验证的流程。你得跳过所有联网校验步骤,手动建立命令入口。
- Linux/macOS:给
composer.phar加执行权限,再创建软链接chmod +x composer.pharsudo ln -sf /path/to/composer.phar /usr/local/bin/composer - Windows:不能直接执行 .phar,需用批处理封装
新建composer.bat,内容为:@php "%~dp0composer.phar" %*
把composer.bat和composer.phar放在同一目录,并将该目录加入系统PATH - 验证是否生效:运行
composer --version,只要输出版本号就说明命令通了
断网时运行 composer install 的前提条件
即使 composer 命令能跑,install 仍可能失败——它默认要连 Packagist 拉包、校验 composer.lock 中记录的 hash、甚至触发插件的 post-install 脚本(比如生成 autoload)。这些都可能隐式发起网络请求。
- 确保项目已有完整的
composer.lock文件,且该文件是在有网环境生成的(含完整 dist URLs 和 sha256 校验值) - 所有依赖包必须已提前下载并放入
vendor/目录,或通过其他方式(U盘拷贝、内网 NFS)同步好整个vendor/——否则install会卡在“Resolving packages”阶段 - 禁用所有需要联网的特性:
composer install --no-plugins --no-scripts --no-progress - 如果项目用了私有仓库或自定义
repositories,必须在composer.json里显式设为"packagist.org": false,并确认所有包来源都指向本地路径("type": "package"+"dist"指向本地 tarball)
为什么 composer update 在断网环境基本不可用
update 的本质是重新解析依赖图、查询所有包的可用版本、比较约束条件、计算最优解——这一步必须访问仓库元数据(packages.json),而 Packagist 不提供离线快照服务。
- 哪怕只改一个包的版本约束,
composer update monolog/monolog也会尝试连https://repo.packagist.org/p2/monolog/monolog.json - 没有网络时,它会卡住几十秒后报错:
Could not fetch https://repo.packagist.org/packages.json, please review your configured repositories - 唯一可行的替代方案:在有网机器上完成
update→ 提交新的composer.lock→ 把 lock 文件带入断网环境 → 再执行install - 切记不要在断网机器上手动编辑
composer.lock:格式敏感、hash 易错、极易导致 autoload 失败
install --no-plugins --no-scripts。任何试图在断网时动态解析、更新、校验的行为,都会撞上网络墙。


















