能,但需满足两个硬条件:composer.lock完整且vendor目录来自同PHP版本、同架构、同扩展环境。

内网机器根本没装 Composer,能直接用 vendor 吗?
能,但必须满足两个硬条件:composer.lock 文件完整未被修改,且 vendor/ 目录是从同一 PHP 版本、同架构(x86_64/arm64)、同扩展(尤其是 ext-zip、ext-openssl)环境下生成的。
常见翻车点:
- 外网打包时用了
--prefer-source,内网缺git命令或网络权限,解包失败 -
vendor/里混入了autoload_files.php或自定义脚本,而内网 PHP 关闭了allow_url_include或禁用了某些函数 - 项目用了平台约束(如
"platform": {"php": "8.2.10"}),但内网 PHP 是8.2.9,composer install会直接拒绝启动,哪怕 vendor 已存在
实操建议:外网打包前先运行 composer install --no-dev --no-scripts --no-autoloader --prefer-dist,再整体压缩 vendor/ 和 composer.lock;内网只需确保 PHP 可执行,无需安装 Composer 二进制。
用 artifact 源离线安装,为什么还是去连外网?
因为 artifact 类型仓库只提供 ZIP 包,不提供元数据(packages.json、composer.json)。Composer 仍需从某个源拉取这些 JSON 文件来解析依赖树——如果没显式配置镜像源,它默认 fallback 到 packagist.org。
正确做法是组合使用:
- 在项目
composer.json中同时声明repositories:一个artifact源 + 一个内网镜像源(如type: "composer"指向https://packagist.internal) - 必须保证内网镜像源已预同步所有依赖的元数据,包括间接依赖(如
psr/log被monolog/monologrequire,但没出现在你项目的require里) - 删掉全局配置里的
http-proxy和残留的repo.packagist,避免干扰:运行composer config -g --unset http-proxy和composer config -g --unset repo.packagist
验证方式:composer install -v 输出中应出现 Loading composer repositories with package information 后紧接 Reading packages.json from ./artifacts/xxx.zip,而不是 Downloading https://repo.packagist.org/...。
缓存目录复制后,composer install 还报 “Could not find package”
不是缓存没拷全,而是 Composer 默认不会主动查本地缓存——它只在下载时把包存进去,安装时仍优先走远程源。必须显式告诉它“别联网,就用我给的缓存”。
关键步骤:
- 把外网机器的
~/.composer/cache/files/整个目录复制到内网某路径,比如/data/composer-cache/ - 在内网机器上执行:
composer config --global cache-files-dir /data/composer-cache - 项目目录下运行:
composer install --no-dev --prefer-dist --no-autoloader --no-scripts --no-progress
注意:
- 路径必须是绝对路径,
cache-files-dir不接受相对路径 - 如果内网机器之前装过 Composer,旧缓存可能干扰,建议先
composer clear-cache -
--no-autoloader很重要:避免因缺ext-zip导致解压失败后 Composer 自动降级尝试git clone,从而触发网络请求
Satis 镜像同步后,内网 install 仍卡在 “Resolving dependencies”
大概率是 Satis 没开启 "require-all": true,导致只同步了顶层 require 的包,没递归抓取子依赖的 composer.json。Composer 解析时发现某个子依赖(比如 symfony/polyfill-mbstring)的元数据缺失,就会卡住等待响应,最终超时。
修复方法:
- 检查 Satis 配置文件(通常是
satis.json),确认包含:"require-all": true - 重新运行
php bin/satis build satis.json web/,build 日志里应看到类似Processed 127 packages, including 89 required by other packages - 确保内网机器访问镜像地址(如
https://packagist.internal/packages.json)能返回完整 JSON,且其中packages键下包含所有间接依赖的条目 - 若镜像用的是自签名证书,内网机器需加
composer config -g secure-http false,否则 HTTPS 请求会被 PHP 拒绝
最易被忽略的一点:Satis build 生成的静态文件必须通过 HTTP 服务(如 Nginx/Apache)对外提供,不能直接用 file:// 协议访问——新版 Composer 已禁用该协议,除非加 --allow-http,但不推荐。











