Elastic Beanstalk PHP平台默认不自动执行composer install,仅解压代码;需确保平台≥7.4、根目录含composer.json和composer.lock,并通过container_commands显式调用预装composer.phar安装依赖。

Composer install 为什么在部署时失败
默认情况下,Elastic Beanstalk 的 PHP 平台不会自动执行 composer install —— 它只解压代码、复制文件,不运行任何构建命令。如果你的项目依赖通过 composer.json 声明,但没显式触发安装,就会出现 Class not found 或 require_once(): failed opening required 这类错误。
常见现象:日志里看到 vendor/autoload.php 找不到,或 composer.lock 存在但 vendor/ 目录为空。
- PHP 平台版本 ≥ 7.4 默认启用 Composer 自动安装,但仅限于根目录存在
composer.json且未禁用该行为时才生效 - 低于 7.4 的平台(如 7.3、7.2)完全不识别
composer.json,必须手动配置 - 即使平台支持,若你用了自定义
.ebextensions覆盖了默认钩子,也可能意外跳过 Composer 步骤
如何强制 Elastic Beanstalk 运行 composer install
最可靠的方式是通过 .ebextensions 配置文件,在部署生命周期的 container_commands 阶段执行安装。注意:不能用 commands,因为那时应用目录还没准备好;必须用 container_commands,它在代码解压后、服务启动前运行。
在项目根目录创建 .ebextensions/01-composer.config,内容如下:
container_commands:
01-install-composer:
command: "php /var/www/html/composer.phar install --no-dev --optimize-autoloader"
ignoreErrors: false
02-chown-vendor:
command: "chown -R webapp:webapp /var/www/html/vendor"
说明:
管理钉钉云文档中的文档、文件夹和内容。适用于创建、搜索、读取或写入文档、创建文件夹整理。也适用于提及云文档、在线文档、钉钉文档、钉文档等关键词的场景。不要在操作多维表、日程、消息或审批流时触发。
-
php /var/www/html/composer.phar是 Elastic Beanstalk 提供的预装 Composer 可执行文件路径,不要自己下载或用curl -sS https://getcomposer.org/installer -
--no-dev避免安装开发依赖,减小部署包体积和运行时风险 -
--optimize-autoloader提升类加载性能,尤其对生产环境必要 -
chown是必须的:EB 默认以root执行container_commands,但 PHP-FPM 以webapp用户运行,权限不匹配会导致 autoload 失败
composer.json 和 composer.lock 必须同时上传
Elastic Beanstalk 不会联网拉取依赖,所有依赖必须由 Composer 在本地生成并打包进部署 ZIP 中 —— 或者让 EB 在实例上运行 install(前提是已上传 composer.lock)。如果只传 composer.json 而没传 composer.lock,composer install 会退化为 composer update 行为,导致依赖版本漂移,甚至因网络策略(如 VPC 无 NAT)直接失败。
验证方式:
- 本地执行
composer install --no-dev --optimize-autoloader后,确认vendor/目录存在且非空 - ZIP 包里必须包含
composer.json、composer.lock,以及(可选但推荐)已生成的vendor/目录 - 若选择“不上传 vendor”,则
composer.lock必须存在,否则 EB 无法确定精确依赖树
多环境共享 vendor 目录的风险
有人尝试把 vendor/ 放到 /var/app/staging 或 EFS 上,让多个部署共用 —— 这在 EB 上不可靠。因为 container_commands 每次部署都运行,而 EB 的 staging 目录会在每次部署时被清空;EFS 挂载点又受平台版本和配置限制(如 PHP 平台默认不挂载 EFS),且并发写入可能引发 autoload cache 冲突。
真正可行的做法只有两种:
- 每次部署都重装
vendor/(推荐,干净、可重现) - 本地
composer install后,把整个vendor/打包进 ZIP(适合依赖稳定、体积可控的项目)
别试图绕过这个环节 —— EB 的部署模型就是“一次构建、多次部署”,vendor/ 属于构建产物,不是运行时状态。

















