必须在本地或CI中用与Lambda一致的PHP版本和架构执行composer install --no-dev --optimize-autoloader,再打包vendor部署;推荐使用AWS官方Docker镜像构建以确保环境一致。
在 AWS Lambda 或 Serverless Framework 环境中,composer install 不能直接在 Lambda 运行时执行(无写入权限、无 PHP CLI 环境、无网络),必须在构建阶段完成依赖打包。
Serverless Framework 和 AWS SAM 都不支持运行时安装 Composer 包。你必须在本地(或 CI 环境)用与 Lambda 相同的 PHP 版本和架构(x86_64 或 arm64)执行 composer install --no-dev --optimize-autoloader,再将 vendor/ 和代码一起 zip 部署。
php8.2);可用 php -v 核对--no-dev:Lambda 不需要 phpunit、psysh 等开发依赖,否则可能超 250MB 解压限制--optimize-autoloader 生成 vendor/autoload.php 的静态映射,提升冷启动性能composer.json 中使用 platform 配置伪造环境——它可能导致 autoloader 生成错误路径本地 PHP 版本或扩展缺失(如 zip、mbstring)会导致 autoload_static.php 生成异常,Lambda 启动时报 Class not found。用官方 AWS Lambda PHP 镜像构建能完全对齐。
docker run --rm -v $(pwd):/var/task public.ecr.aws/sam/build-php8.2 \ /bin/sh -c "cd /var/task && composer install --no-dev --optimize-autoloader"
public.ecr.aws/sam/build-php8.1、public.ecr.aws/sam/build-php8.3
zip、curl、git 和必要扩展,无需额外配置composer update——会污染 co
mposer.lock,应只做 install
serverless.yml 默认只打包当前目录下非 node_modules 的文件,vendor/ 若在项目根目录外(如被 composer install -d ../shared-vendor 指定),会被忽略。
package/include 显式包含:package:
include:
- 'vendor/**'vendor/ 在子目录(如 src/vendor),需确认 composer install -d src 后路径正确,并在 include 中写 src/vendor/**
package: individually: true)后,必须为每个函数单独指定 package/include,否则 vendor/ 不会进入 ZIPfunctions.*.package.artifact 指向已有 ZIP——它绕过 include 规则,vendor 可能缺失最易被忽略的是 autoloader 路径硬编码问题:某些包(如 monolog/monolog)在生成优化类映射时,会把绝对路径写进 vendor/composer/autoload_static.php。Docker 构建时若挂载路径不一致(如 /var/task vs /home/project),Lambda 解压后 require 会失败。解决方法只有两个:用标准挂载路径(如上面示例),或改用 composer install --classmap-authoritative(更严格,但兼容性略低)。
# php
# include
# 架构
# 解决方法
# 解压
# curl
# 编码
# php8
# composer
# docker
# node
# json
# git
# js
# require