PHP Serverless 函数:AWS Lambda — 从理论到实践
现代 Web 开发正越来越多地摒弃传统的单体服务器,转而采用云计算。Serverless 架构(即“无服务器”)允许开发者完全专注于代码,无需担心基础设施管理。AWS Lambda 是实现这种架构最流行的服务之一。然而,长期以来人们认为 PHP 不适合 serverless。这是一个误解。在本文中,我们将探讨如何在 AWS Lambda 上运行 PHP 函数,需要哪些工具,以及如何优化性能。
什么是 AWS Lambda 以及如何将 PHP 融入其中?
AWS Lambda 是一种计算服务,它响应事件运行您的代码,并自动管理计算资源。您只需为实际执行时间和请求次数付费。Lambda 原生支持 Node.js、Python、Java、Go 和 .NET,但 PHP 不在其“开箱即用”的支持列表中。然而,这并非问题:我们可以使用自定义运行时 (Custom Runtime) 或现成的封装包,例如 Bref。
Bref 是一个开源项目,它为 AWS Lambda 上的 PHP 提供了现成的运行时,以及与框架(Laravel、Symfony)的集成。借助它,您可以编写事件处理器、API 端点,甚至是运行在 serverless 模式下的完整 Web 应用程序。
在 Lambda 上运行 PHP 的主要组件:
- Bref Runtime — 包含 PHP 解释器和必要扩展的层。
- 事件 (Event) — 触发函数执行的触发器(HTTP 请求、S3 文件上传、DynamoDB 变更)。
- 处理器 (Handler) — 接收并处理事件的 PHP 函数或类方法。
环境配置与第一个示例
我们需要 Composer、Docker(用于构建)和一个 AWS 账户。安装 Bref:
composer require bref/brefBref 使用 Docker 镜像进行本地测试和构建。安装后,创建一个文件 serverless.yml — 用于部署到 AWS Lambda 的配置文件。
serverless.yml 配置示例:
service: my-php-function
provider: name: aws region: us-east-1 runtime: provided.al2
plugins: - ./vendor/bref/bref
functions: hello: handler: index.php layers: - ${bref:layer.php-81} events: - httpApi: 'GET /hello'现在编写一个最简单的处理器 — 文件 index.php:
<?php
require __DIR__ . '/vendor/autoload.php';
return function ($event) { $name = $event['queryStringParameters']['name'] ?? 'World'; return [ 'statusCode' => 200, 'body' => "Hello, $name!", ];};这段代码返回一个包含问候语的 JSON 响应。要本地运行,请使用命令:
vendor/bin/bref local hello部署与触发器:从 HTTP 到 S3
本地验证后,可以将函数部署到云端。确保您已配置好 AWS credentials(通过 AWS CLI 或环境变量)。执行:
serverless deploy在控制台中,您将看到您的 API Gateway URL(如果配置了 HTTP 触发器)。现在可以通过浏览器或 curl 访问该函数。
PHP 函数的其他流行触发器:
- S3 Events — 处理文件上传/删除。
- SQS/SNS — 异步处理消息队列。
- CloudWatch Events — 按计划运行(cron)。
- DynamoDB Streams — 响应数据变更。