PHP无服务器函数:从A到Z的AWS Lambda完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么无服务器和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/


三种部署方式

  1. Bref(推荐) — 最简单。使用serverless.yml和现成的层。
  2. 手动构建 — 您为Amazon Linux 2编译PHP并打包成ZIP。
  3. 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(), ]), ];}


博客

书籍推荐