composer install离线必挂是因为默认强制联网校验元数据,必须设composer_disable_network=1并配合--no-plugins --no-scripts,否则即使有vendor和lock也会访问packagist.org报错。

离线部署 PHP 项目时,Composer 不是“不能用”,而是必须绕过所有远程元数据请求环节——composer install 能跑通的前提,是它根本不会尝试发任何 HTTP 请求。
为什么 composer install 在离线机上默认必挂
不是网络不通才失败,而是 Composer 默认行为就包含强制校验远程仓库元数据。哪怕 vendor/ 目录完整、composer.lock 也存在,只要没显式切断联网路径,它就会在解析阶段访问 https://repo.packagist.org/packages.json,报错形式通常是:Could not fetch https://repo.packagist.org/packages.json 或 Connection refused。
关键点:
-
COMPOSER_DISABLE_NETWORK=1是硬性开关,不设它,所有--no-xxx参数都无效 - 全局配置里残留
repo.packagist(哪怕值为false)也会触发 fallback 校验,必须运行composer config --global repo.packagist false彻底移除 -
composer create-project在离线环境完全不可用——它设计上就强制联网解析模板项目,--offline参数不存在,COMPOSER_DISABLE_NETWORK=1对它也不生效
最稳的离线部署路径:复制 vendor/ + 补 dump-autoload
这是成功率最高、调试成本最低的方式,前提是源机与目标机环境一致(PHP 小版本、mbstring/openssl/zlib 扩展、Composer 版本建议对齐)。
操作步骤:
- 在联网机执行:
composer install --no-dev --prefer-dist --optimize-autoloader,再用最小代码验证 autoload 是否正常:require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL'; - 打包整个项目目录(含
vendor/、composer.lock、composer.json),拷入离线机 - 离线机上先清空可能干扰的缓存:
composer config --global cache-dir /dev/null - 执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader - 最后必须补一记:
composer dump-autoload -o,否则运行时大概率报Class not found
如果不能复制 vendor/,只能靠缓存包重建
适用场景:部署包体积受限、或需统一管理依赖分发。核心是让 Composer 从本地 ZIP 文件加载,而不是远程下载。
前提条件:
- 联网机已完整执行过
composer install --prefer-dist --no-dev,确保所有子依赖 ZIP 都进缓存(路径通常为~/.composer/cache/files/) - 把整个
~/.composer/cache/files/目录打包,拷到离线机固定路径(如/opt/composer-cache) - 离线机显式配置缓存路径:
composer config --global cache-files-dir /opt/composer-cache
然后执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --prefer-dist- 再
composer dump-autoload -o
注意:composer.lock 中若含 "source" 类型条目(如 "type": "git" 或 "dev-master"),离线时无法校验,install 必然失败——这种写法本身就不适合离线部署。
新增包或调试时怎么离线加依赖
composer require 在离线环境下完全不可用,它必须联网查包名和版本。唯一可靠方式是使用 path 类型仓库。
操作要点:
- 目标包根目录下必须有合法
composer.json,含完整"name"(如"acme/utils")和"version"或分支标识(如"dev-main") - 项目根目录
composer.json中添加:"repositories": [{"type":"path","url":"./packages/my-utils"}](Windows 下url需带盘符,如C:/projects/my-pkg) - 然后执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts
这个机制不走网络,只做本地文件系统扫描,但要求路径真实存在、composer.json 结构合法、且 name 唯一不冲突。
最容易被忽略的是 composer.lock 里隐含的远程来源信息——哪怕你把所有 ZIP 都备好了,只要 lock 文件里某一行还写着 "dist": {"url": "https://api.github.com/..."},Composer 就可能尝试发起 HEAD 请求校验。所以离线部署前,务必确认 lock 文件是在纯 --prefer-dist 模式下生成的,且没有混入 source 类型依赖。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











