Laravel本身是基于PHP的传统Web框架,而Vapor是Laravel官方推出的无服务器部署工具,它把应用打包后运行在AWS Lambda上。这意味着你不再需要维护EC2实例或Nginx,所有请求由Lambda按需执行。PHP在Serverless环境下运行,核心依赖Lambda提供的自定义运行时,Vapor已经封装好了这一层,开发者只需关注业务代码与配置。

一、Vapor环境准备与安装
在开始之前,你需要一个AWS账号并配置好具有足够权限的IAM用户,同时本地要安装PHP与Composer。Vapor通过命令行工具与AWS交互,因此先使用Composer全局安装Vapor CLI是最直接的方式。安装完成后,使用邮箱注册的Vapor账号进行登录,CLI会把凭证保存在本地配置中。
很多人在这一步遇到区域选择错误,导致后续Lambda与数据库不在同一可用区,产生额外延迟。建议在vapor.yml中明确指定region,不要依赖默认值。下面是一段典型的安装与登录命令:
# 全局安装Vapor CLI composer global require laravel/vapor-cli # 将Composer全局路径加入环境变量(Linux/Mac示例) export PATH=$PATH:$HOME/.composer/vendor/bin # 登录Vapor vapor login
安装后可以用vapor list查看已有项目。如果返回空列表说明账号正常但还未创建环境。注意Vapor并非免费,AWS Lambda与API Gateway会产生按量费用,但开发环境额度通常足够测试。
二、编写vapor.yml配置文件
Vapor使用项目根目录下的vapor.yml来描述部署环境。这个文件定义了Lambda内存、PHP版本、环境变量以及要挂载的AWS服务。与本地.env不同,vapor.yml中的配置会在部署时注入到Lambda运行环境,且支持多环境(如staging、production)隔离。
一个常见误区是把所有配置写死在代码里,导致切换环境要改源码。正确做法是在vapor.yml中用environments节点区分,并用variables传入敏感信息。以下示例展示了基础结构:
id: 12345
name: my-laravel-app
environments:
staging:
memory: 1024
php: 8.2
cli-memory: 512
variables:
APP_ENV: staging
LOG_CHANNEL: stderr
database: my-db
cache: my-cache
production:
memory: 1769
php: 8.2
variables:
APP_ENV: production
LOG_CHANNEL: stderr
这里database和cache指向Vapor托管的RDS与Redis,部署时自动打通内网。如果本地用SQLite,必须改为RDS,因为Lambda文件系统只读,SQLite无法写入。Vapor会在部署前运行php artisan config:cache,因此配置务必通过变量管理。
三、处理Serverless下的文件系统与静态资源
Lambda实例本身是无状态的,每次冷启动都是全新文件系统,只有/tmp可写且空间有限。Laravel默认把缓存、会话、日志写到storage目录,这在Serverless中会失败。Vapor自动把storage/logs重定向到CloudWatch,但会话若用文件驱动仍需改造成数据库或Redis驱动。
静态资源如CSS、JS、图片则不应由Lambda提供,而是部署到S3并由CloudFront分发。Vapor在vapor deploy时会把public目录上传到S3,同时设置CNAME。你只需在模板中继续使用mix()辅助函数,Vapor会替换成CDN地址。示例如下:
<?php
// config/session.php 中修改驱动
return [
'driver' => env('SESSION_DRIVER', 'redis'),
'lifetime' => 120,
];
// 部署命令
// vapor deploy staging
改造后,用户请求先到API Gateway,触发Lambda执行PHP,页面中引用的资产走CDN,会话存Redis,彻底摆脱本地磁盘依赖。这种结构下水平扩容由AWS自动完成,你不需要关心并发机器数量。
四、部署与冷启动优化
执行vapor deploy 环境名后,CLI会打包代码、上传Layer、更新Lambda与API Gateway。首次部署较慢,后续增量更新只传差异。冷启动指Lambda闲置后被回收,下次请求需重新初始化PHP运行时,通常增加300到800毫秒延迟。
减少冷启动的办法包括适当提高内存(CPU随内存线性分配)、使用OPcache、避免在bootstrap中做重IO。Vapor默认开启OPcache,但你可在vapor.yml加runtime: php-8.2:al2指定带预热层。以下代码展示用Artisan命令预热缓存:
<?php // 部署后执行,避免首次请求编译路由 artisan route:cache artisan config:cache // 在vapor.yml的build节点可配置自动执行
经过上述步骤,传统Laravel项目就能以PHP形式运行在Vapor无服务器架构上。你获得了免运维、按量计费与弹性伸缩,代价是必须适应只读文件系统和托管服务依赖。对于中小流量API或官网,这套方案能显著降低运维负担。
PHPVapor_LaravelServerless修改时间:2026-07-31 15:06:36