引言:为什么无服务器和PHP并非矛盾
长期以来,人们认为PHP和无服务器架构不兼容。PHP与Apache或Nginx的常驻进程相关联,而无服务器则与Node.js或Python相关联。然而,随着像Bref这样的工具以及AWS Lambda对自定义运行时环境(Custom Runtimes)的官方支持的出现,PHP获得了新生。
无服务器函数允许您在不管理服务器的情况下运行PHP代码。您只需为实际执行时间付费(精确到毫秒)。这是以下场景的理想解决方案:
- Webhook处理器(Telegram、Stripe、Slack);
- 低负载的微服务;
- 通过CloudWatch Events执行的定时任务(cron);
- API代理和轻量级后端。
在本文中,我们将详细讲解如何从零开始在AWS Lambda上运行PHP:从创建IAM角色到部署一个可工作的函数。
1. PHP在AWS Lambda中的架构
自定义运行时如何工作
AWS Lambda原生仅支持Java、Go、PowerShell、Node.js、C#、Python和Ruby。要运行PHP,我们使用自定义运行时(Custom Runtime)——这是一个特殊的可执行文件(bootstrap),它与Lambda运行时API进行通信。
最流行的方法是使用Bref框架。它附带了一个现成的层(Layer),包含PHP 8.x、Composer和一组标准扩展。
// Bref的项目结构project/├── index.php // 入口点├── composer.json├── serverless.yml // 部署配置└── vendor/三种部署方式
- Bref(推荐) — 最简单。使用serverless.yml和现成的层。
- 手动构建 — 您为Amazon Linux 2编译PHP并打包成ZIP。
- Docker镜像 — 使用Lambda容器镜像(自2020年起支持)。
我们将介绍第一种方式——它适用于90%的任务。
2. 逐步配置:从安装到第一个请求
步骤1. 环境准备
确保您已安装:
- PHP 8.0+(本地)
- Composer
- Node.js和npm(用于Serverless Framework)
- 已配置凭证的
aws-cli工具
全局安装Serverless Framework:
npm install -g serverless步骤2. 创建项目
composer create-project bref/bref my-php-lambdacd my-php-lambda初始化后,您会看到serverless.yml文件。我们来编辑它:
service: my-php-app
provider: name: aws region: eu-central-1 # 选择最近的区域 runtime: provided.al2 # Amazon Linux 2
plugins: - ./vendor/bref/bref
functions: hello: handler: index.php description: '简单的PHP函数' layers: - ${bref:layer.php-80} # 包含PHP 8.0的层步骤3. 编写函数本身
打开index.php:
<?php
require __DIR__ . '/vendor/autoload.php';
/** * Lambda函数处理器 * @param array $event 来自AWS的输入数据(API Gateway、SQS等) * @return array JSON格式的响应 */function handler(array $event): array{ // 记录到CloudWatch error_log('收到请求:' . json_encode($event));
$name = $event['queryStringParameters']['name'] ?? '访客';
return [ 'statusCode' => 200, 'headers' => [ 'Content-Type' => 'application/json', ], 'body' => json_encode([ 'message' => "你好,{$name}!", 'timestamp' => time(), ]), ];}