Bref是让PHP运行在AWS Lambda的胶水层,非全栈框架;三步部署:装bref/bref、配serverless.yml、改handler指向入口文件;HTTP用httpApi事件,非HTTP场景需手动解析$event。

PHP项目怎么用Bref部署到AWS Lambda
直接结论:Bref不是“框架”,而是让PHP能在Lambda上跑的胶水层 + 预置运行时 + CLI工具。你不需要重写应用,只要把现有index.php或public/index.php(如Laravel)接入Bref的handler即可。
核心动作分三步:装Bref、写serverless.yml、改入口函数。别试图把它当Laravel那种全栈框架来学——它不处理路由、ORM或中间件,只管“怎么启动PHP、怎么传HTTP/Event数据进来”。
- 用
composer require bref/bref安装(推荐dev-main或v2.x最新稳定版,v1已停更) -
serverlessCLI必须全局安装(npm install -g serverless),Bref依赖它打包和部署 - 不要手动写Dockerfile——Bref自带
php-82-fpm等预编译层,自己打镜像反而容易出exec format error
HTTP API怎么配才能正常接收GET/POST请求
Bref默认用api运行时,但它的handler函数签名和原生Lambda不同:它自动解析API Gateway v2事件,把$_GET、$_POST、$_SERVER补全,行为接近传统Apache/Nginx。
关键配置在serverless.yml里:
functions:
web:
handler: public/index.php
layers:
- ${bref:layer.php-82-fpm}
events:
- httpApi: '*' # 必须用httpApi,不是http(后者是v1,已过时)
- 用
httpApi而非http,否则会报Invalid request provided——v1事件结构Bref v2不兼容 -
handler路径要指向实际入口文件,比如Laravel是public/index.php,Slim是public/index.php,纯PHP是index.php - 别在代码里调
$_SERVER['REQUEST_URI']硬编码路径——Bref会重写它,应依赖$_SERVER['REDIRECT_URL']或框架自身的Router
为什么本地测试能跑,部署后502或空白页
90%是权限或路径问题。Lambda里/var/task是只读的,所有写操作(缓存、日志、上传临时文件)必须指向/tmp。
- Laravel记得改
config/cache.php的path为/tmp/laravel-cache,否则cache:clear失败静默挂掉 - Log驱动不能用
daily或single(默认写storage/logs,只读),换成errorlog或自定义写/tmp/app.log - Composer autoload可能失效——确保
vendor/autoload.php被handler包含,且没用opcache.enable=1导致类找不到(Bref默认关opcache) - 如果看到
Function returned an invalid response (must be a valid JSON object),说明你的PHP脚本没输出任何东西(比如die()在开头、header()后echo失败),加var_dump(1); exit;快速定位卡点
非HTTP场景(如SQS、S3事件)怎么写handler
HTTP是特例,其他事件类型(S3、SQS、EventBridge)走的是Lambda原生事件格式,Bref不帮你转$_POST——你要自己解析$event参数。
例如处理S3上传事件:
return function ($event) {
$bucket = $event['Records'][0]['s3']['bucket']['name'];
$key = $event['Records'][0]['s3']['object']['key'];
// 手动读取S3文件:$s3 = new Aws\S3\S3Client([...]); $s3->getObject([...])
};
- 这类函数
handler必须返回值(哪怕return null),否则Lambda认为执行失败 - 不要用
$_SERVER获取环境——S3事件里没有HTTP_*变量,所有上下文都在$event和$context里 - 大文件处理慎用
/tmp——Lambda内存上限就是/tmp大小,10MB文件+解压可能爆内存,考虑流式处理或触发Step Functions分片
最常被忽略的一点:Bref的php-82-fpm层只含PHP核心扩展,ext-amqp、ext-sqlite3这些得自己用custom layer加,或者切到php-82(非FPM)层再手动dl()扩展——但后者不推荐,稳定性差。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











