离线环境装 Composer 包需提前在联网机器执行 composer install 生成 vendor/ 和 composer.lock,再打包整个项目目录;离线机仅能运行 composer install,严禁 composer update 或依赖网络的私有仓库。

离线环境装 Composer 包,本质不是“让 Composer 离线运行”,而是提前把 composer install 依赖的全部文件(包源码、composer.lock、元数据)带进去。没网络时 composer install 能成功,前提是它根本不需要连 Packagist 或任何远程仓库。
离线前必须在有网机器上完成 pack & lock
离线部署失败,八成是因为跳过了这步:你不能只拷贝 vendor/ 目录或手动下载 zip 包完事。Composer 的依赖解析、版本约束、自动加载生成都强依赖 composer.lock 和本地缓存。
- 在与目标环境 PHP 版本、扩展(如
mbstring、curl)一致的联网机器上操作 - 确保项目根目录有完整的
composer.json,且已运行过composer update(生成/更新composer.lock) - 执行:
composer install --no-dev --optimize-autoloader
——这会填充vendor/并生成优化后的 autoload 文件 - 然后运行:
composer archive --format=zip --dir=./dist ./
(可选),但更推荐直接打包整个项目目录(含vendor/、composer.lock、composer.json)
离线机器上禁止运行 composer update
composer update 在无网络时必然报错,比如:Could not fetch https://repo.packagist.org/packages.json 或 Failed to decode response: file_get_contents(): failed to open stream: No such file or directory。它硬要连外网,拦不住。
- 离线机上只能用
composer install,且必须保证当前目录存在有效的composer.lock - 如果误删了
composer.lock,离线机无法恢复——没有 lock 就没法确定包版本,也没法跳过远程元数据拉取 - 若需更新依赖,必须回到联网环境改
composer.json→composer update→ 重新打包
自建私有 repo 不等于“离线”,只是换了个内网地址
有人以为搭个 Satis 或 Toran Proxy 就算离线方案,其实不然:它只是把 Packagist 换成本地 HTTP 服务,composer install 仍需发起 HTTP 请求。一旦内网 repo 服务宕机或配置错误(比如 repositories 地址写错、SSL 证书不被信任),照样失败。
立即学习“PHP免费学习笔记(深入)”;
- 真正离线 = 零网络 I/O,所有包内容必须以文件形式落地(即
vendor/已存在) - 若坚持走私有 repo,需额外导出完整包快照:
composer archive --format=tar --dir=/tmp/pkgs/ --without-dev
,再配合repositories.type: package+dist手动定义每个包路径——复杂度陡增,一般项目没必要 - 注意:
composer config --global repositories.packagist.org false可禁用默认源,但不会让install自动 fallback 到本地 vendor;它只是防止意外连外网
vendor 目录体积大?可以裁剪但别动 autoload
为了减小传输体积,有人想删 vendor/*/tests/、vendor/*/docs/ 或 vendor/*/examples/。可以,但必须避开 autoload 机制依赖的路径。
- 安全裁剪方式:
find vendor -name "tests" -type d -exec rm -rf {} +,同理处理docs、examples、.git - 严禁删除
vendor/autoload.php、vendor/composer/下任何文件——它们是自动加载的核心,删了会导致Class not found - 如果用了
--optimize-autoloader,vendor/composer/autoload_classmap.php是生效的,别手动改它
最易被忽略的一点:离线部署后,务必在目标机器上跑一次 php -d extension=mbstring.so -d extension=openssl.so -d extension=curl.so -m | grep -E "(mbstring|openssl|curl)",确认 PHP 扩展真实可用。很多“安装成功但运行报错”的问题,根源是扩展名对不上(比如 Alpine Linux 里叫 mbstring.so,CentOS 叫 php-mbstring)或者 .so 文件根本没拷过去。











