离线环境需用 composer config -g 指向内网 HTTP 镜像源,禁用 file://;镜像须含 packages.json 等文件且响应头为 application/json;同步推荐 packagist-mirror 工具并指定 --lock-file 缩减体积。

离线环境根本没法直接用 composer install
因为默认行为会连 packagist.org,没网络就卡死在 “Loading composer repositories with package information” 这一步。不是报错,是挂起——很多人误以为卡住了,其实是 DNS 超时等了 30 秒才失败。离线部署的核心不是“加速”,而是彻底绕过公网源。
必须用 composer config 指向本地镜像源
内网镜像不是简单复制 vendor 目录,得让 Composer 认为本地路径就是 Packagist 的替代品。关键操作是重写仓库配置:
- 在目标机器(无网)执行:
composer config -g repos.packagist '{"type": "composer", "url": "http://your-intranet-mirror/"} -
url必须是能被 PHP cURL 访问的 HTTP 地址,file://协议不支持(Composer 2+ 明确禁用) - 若用 Nginx/Apache 托管镜像目录,确保根路径下有
packages.json和provider-*.json文件,否则报Could not fetch https://.../packages.json - 别漏掉
-g(全局),否则只对当前项目生效,新项目还得重复配
镜像数据怎么同步到内网?用 packagist-mirror 工具最稳
手动下载 ZIP、解压、生成 JSON?不可靠。官方推荐方案是用 packagist-mirror(PHP 实现)在有网机器上拉取并生成静态文件结构:
- 有网机器跑:
php mirror.php --mirror-url http://your-intranet-mirror/ --packages-dir /var/www/mirror/ - 它会按 Composer 协议生成完整目录树,包括
dist归档和sourceGit 链接(注意:内网镜像一般只存 dist,source 需额外搭 Git 服务) - 同步频率建议每天一次 cron,避免全量重拉;增量更新依赖
--since参数,但需保存上次时间戳 - 镜像体积很大(完整包超 100GB),实际只需同步项目
composer.lock里明确列出的包 + 其依赖,用--lock-file composer.lock可缩小 90% 数据量
常见错误:Package xxx could not be found 或 404
不是网络问题,是镜像缺失或路径映射错位。典型原因:
- 镜像未包含私有包(如公司内部
company/utils),必须把私有仓库也加进repos配置,且用type: "package"手动定义 - 镜像服务返回了 200 但内容为空(比如 Nginx 把
.json当二进制文件处理),检查响应头Content-Type: application/json -
composer update在离线机上仍尝试访问公网——说明config没生效,用composer config -g -l | grep repos确认输出里有你设的 URL - PHP 版本太低(JSON decode error,优先在目标环境验证 PHP 版本
离线镜像最难的不是搭建,是保证每次同步后 packages.json 的哈希校验和真实包列表严格一致;少一个字节,Composer 就拒绝加载整个仓库。










