离线构建时 vendor/autoload.php 慢是因为冷启动反复 stat() 和 file_exists() 扫描 vendor 目录,需在 docker 构建阶段执行 composer install --no-dev --optimize-autoloader --classmap-authoritative,并配合 satis 镜像、内网 repositories、验证断网等确保真离线。

为什么离线构建时 vendor/autoload.php 还是慢?
不是没装上,而是默认 autoload 机制在冷启动时反复 stat() 和 file_exists() 扫描整个 vendor/ 目录——Serverless 或容器首次启动时,这个过程单次就超 600ms。光靠 composer install --no-dev 不够,必须触发 classmap 生成并强制走它。
-
composer install --no-dev --optimize-autoloader --classmap-authoritative必须在构建阶段(即 Docker 构建的 RUN 步骤里)执行,不能只在本地跑完再 COPY vendor - 漏掉
--classmap-authoritative,哪怕有 classmap 文件,Composer 仍会 fallback 到 PSR-4 扫描逻辑 - 如果项目用了
autoload-dev,且里面写了"../src/"这类跨目录路径,会导致 classmap 包含非运行时代码,体积膨胀、加载变慢
Dockerfile 里怎么写才真正离线?
别信“COPY vendor”能省事——vendor 是结果,不是输入;离线构建的关键是让 Composer 在构建过程中不发任何外网请求。这要求:镜像内已预置完整 Packagist 元数据 + dist 包 + 正确配置。
- 用多阶段构建:第一阶段用
composer/composer:2-bin镜像,把 Satis 镜像目录(含packages.json和dist/)挂进来,执行composer install - 第二阶段基础镜像里不装 Composer,只 COPY 第一阶段生成的
vendor/和autoload.php -
repositories必须写进composer.json,且 URL 指向容器内可访问路径(如http://localhost:8000),file://在 Alpine 或非 root 用户下大概率失败 - 构建时加
--no-plugins --no-scripts,防止某些包的 post-install-cmd 尝试联网或调外部命令
离线环境里 composer.lock 还管用吗?
管用,但前提是它对应的是你本地镜像里的元数据快照。直接拿线上生成的 lock 文件丢进离线环境,大概率报 Could not find package —— 因为 lock 里记录的 provider URL(比如 https://repo.packagist.org/p2/monolog/monolog.json)在离线环境根本不存在。
- 离线 lock 文件必须由同一套本地镜像生成:先在有网络的机器上用 Satis 同步全量数据,再用该镜像跑
composer install输出 lock - 确认 lock 文件里所有
dist.url字段都是相对路径或指向内网地址(如http://192.168.1.100/dist/monolog-monolog-1.27.1.zip) - 删掉
composer.lock再重装不是修复手段,而是放弃版本契约——尤其在 CI/CD 流水线里,会导致不同构建节点产出不一致的 vendor
build 阶段怎么验证是否真离线?
最直接的办法:在 RUN 步骤末尾加一条断网检测。Docker 构建本身不拦截 DNS,得靠命令实测。
- 在
composer install后插入:curl -sf http://127.0.0.1:8000/packages.json || exit 1(验证本地服务可达) - 再加:
! curl -sf https://repo.packagist.org/packages.json && echo "offline confirmed" || exit 1(确认外网不通) - 如果构建中出现
Resolving dependencies卡住超过 10 秒,立刻中断——说明某处还在尝试 fallback 到官方源,检查repositories是否遗漏、config是否禁用packagist.org
require-dependencies 开关、镜像服务的 URL 前缀、lock 文件里的 dist 地址、Docker 构建时的网络隔离粒度——四个点只要一个没对齐,composer install 就会在解析阶段静默失败。











