必须在CI构建阶段完成vendor预热和压缩,因云函数运行时无写权限、无PHP CLI、无网络、无zip扩展,导致composer install静默失败;需用目标环境一致的Docker镜像执行--no-dev --optimize-autoloader --classmap-authoritative --prefer-dist及后续dump-autoload -o -a,并清理冗余文件、校验autoload路径。

不能在函数运行时执行 composer install,必须在构建阶段完成依赖预装和压缩——因为云函数环境无写权限、无 PHP CLI、无网络、无 zip 扩展,任何运行时安装都会静默失败或报 Permission denied。
为什么 vendor 目录压缩后仍可能超限
常见误区是只用 zip -r 打包就完事。但 Serverless 平台(如阿里云 FC、AWS Lambda)对解压后体积有硬限制(Lambda 为 250MB),而 Composer 默认下载的 .dist 包含大量测试文件、文档、.git 目录,未清理前单个包(如 monolog/monolog)就能贡献 10MB+ 冗余。
- 必须在
composer install后执行find vendor -name "*.md" -o -name "tests" -o -name ".git" -o -name "docs" | xargs rm -rf主动清理 -
composer.json中启用"exclude-from-classmap": ["tests/", "Tests/", "test/", "Test/"],避免这些路径被 autoload 映射,否则dump-autoload --classmap-authoritative仍会扫描它们 - 使用
.gitattributes声明导出排除项:vendor/** export-ignore配合git archive可进一步减小 CI 构建源体积
如何让压缩后的 vendor 真正可加载
压缩不是目的,能正确 require 'vendor/autoload.php' 才是关键。很多部署失败不是因为 ZIP 太大,而是 autoload 文件损坏或路径错位。
-
composer install --no-dev --optimize-autoloader --classmap-authoritative --prefer-dist必须加--classmap-authoritative,否则autoload_static.php不生成,冷启动时类找不到 - 执行完
composer install后,务必追加composer dump-autoload --optimize --classmap-authoritative,否则某些框架(如 Laravel)的post-install-cmd不触发,autoload_static.php缺失 - 入口文件(如
index.php)中require路径必须基于 ZIP 根目录,例如:require __DIR__ . '/vendor/autoload.php';,不能写成require 'vendor/autoload.php';(相对路径行为不可靠)
Docker 构建时压缩与缓存复用的实操要点
本地构建容易因 PHP 版本、扩展缺失(如 mbstring、zip)导致 autoload_static.php 生成异常,Lambda 启动时报 Class not found。唯一可靠方式是用与目标运行时完全一致的镜像构建。
- 使用官方构建镜像,例如:
public.ecr.aws/sam/build-php8.2(AWS)、registry.cn-hangzhou.aliyuncs.com/aliyunfc/runtime-php82:build(阿里云) - 构建命令示例:
docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-php8.2 sh -c "cd /var/task && composer install --no-dev --optimize-autoloader --classmap-authoritative --prefer-dist && composer dump-autoload --optimize --classmap-authoritative" - 构建完成后,显式提取并上传
/root/.composer/cache到对象存储,下次构建挂载为--cache-from或volume,避免重复下载
真正难的不是压缩本身,而是压缩后能否稳定加载——这取决于构建环境是否与运行时一致、autoload 是否权威生成、以及路径引用是否严格匹配 ZIP 结构。任何一环松动,都会在冷启动时表现为“类找不到”且无有效错误日志。


















