PHP版本和扩展必须提前装好,如mbstring、openssl、zlib等;目标机PHP小版本需与源环境完全一致;composer需可执行且全局禁用Packagist源;必须设置COMPOSER_DISABLE_NETWORK=1并配合--no-plugins --no-scripts等参数;vendor或缓存包须规范打包传输。

PHP 版本和扩展必须提前装好
Composer 离线安装不是“断网就能跑”,它对运行环境有硬性依赖。哪怕 vendor 目录完整、composer.lock 一字未改,只要目标机缺关键扩展,vendor/autoload.php 就会 require 失败,报 Class not found 或直接 Fatal error。
必须确认已启用以下 PHP 扩展:
-
mbstring(字符串处理,几乎所有包都依赖) -
openssl(校验哈希、解压 zip、加载 HTTPS 资源元数据) -
zlib(解压 dist 包,--prefer-dist场景下必用) -
curl或php_stream_context_create支持(部分插件/脚本仍可能触发,禁用插件后可降级为非必需,但不建议冒险)
PHP 版本需与源环境一致到小版本号,例如源是 8.2.12,目标不能是 8.2.13——PHP 内部 API 微调可能导致 ReflectionClass 加载失败或 __serialize 兼容问题。
Composer 本身要能执行,且不能残留全局配置
目标机必须能运行 composer 命令,这意味着:
-
php在$PATH中,且路径与源环境一致(尤其影响bin/脚本,如phpunit) -
composer可执行文件已安装(推荐用官方 installer 安装,不建议仅复制 phar 文件) - 全局配置里不能留有
repo.packagist源:执行composer config --global repo.packagist false彻底禁用,否则即使设了COMPOSER_DISABLE_NETWORK=1,也会 fallback 校验失败
检查方式:composer config --global --list | grep packagist,输出应为空或显示 false。
离线模式必须显式启用,不能靠“断网”自动触发
Composer 没有“智能离线检测”。只要没设环境变量或参数,它就会在 install 阶段尝试请求 https://repo.packagist.org/packages.json,报错 Could not fetch 并退出——哪怕 vendor/ 已存在、composer.lock 完整、网络只是临时抖动。
必须提前设置:
-
COMPOSER_DISABLE_NETWORK=1(Linux/macOS)或set COMPOSER_DISABLE_NETWORK=1(Windows CMD)——这是所有--no-xxx参数生效的前提,不设它,其余全是摆设 - 同时加
--no-plugins --no-scripts --no-autoloader,防止插件初始化、脚本执行、autoload 重建过程中的隐式联网行为
注意:--no-autoloader 是为了跳过 autoload 重建环节(该环节可能触发远程类查找),但后续必须补一记 composer dump-autoload -o,否则运行时几乎必然 Class not found。
vendor 目录或缓存包必须按规范打包传输
两种主流离线路径,准备方式完全不同:
- 若走
vendor/直接迁移:必须连同composer.lock一起拷贝;打包命令用tar -czf vendor.tgz vendor/,别依赖.gitignore(某些包的resources/或dist/目录被忽略但实际需要) - 若走缓存预下载(更稳):在线机先跑
composer install --no-install --prefer-dist,再打包整个~/.composer/cache/files/(Linux/macOS)或%APPDATA%\Composer\Cache\files\(Windows),目标机解压到相同路径,并运行composer clear-cache后再install
特别注意:composer.lock 中若有 "type": "git" 或 "source" 字段(比如 "dev-master" 或 GitHub URL),离线时无法校验 commit hash,install 必然失败——这类包必须提前转成 --prefer-dist 模式,或改用 Satis 构建私有镜像。











