无服务器上的 PHP:面向 Web 开发者的 AWS Lambda 指南

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

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

开始课程

PHP 与无服务器:你意想不到的组合

\n\n

当我们听到“Serverless”(或“无服务器计算”)时,首先联想到的是 JavaScript、Python 或 Go。PHP 在此背景下似乎成了“恐龙”,被困在共享主机和单体 WordPress 的时代。但让我们面对现实:PHP 依然活跃、健康,并且比你想象的更灵活。

\n\n

今天,我们将探讨如何在 AWS Lambda 及其同类方案中运行 PHP 代码。你将了解到为什么无服务器 PHP 不是魔法,而是用于 API、Webhook 处理器和微服务的实用工具。剧透:你无需放弃你喜爱的语言。

\n\n

无服务器到底是什么?

\n\n

让我们立即澄清一个误解。“Serverless”并不意味着“没有服务器”。它的意思是你不必考虑服务器。平台(AWS、Google Cloud、Vercel)自行管理基础设施:扩展、更新、修复。你只需上传代码并按执行时间付费。

\n\n

这对 PHP 来说是一个挑战。因为 PHP 传统上需要 Web 服务器(Apache、Nginx)和 PHP-FPM 模块。但技术不会停滞不前。

\n\n

PHP 如何在无服务器环境中运行?

\n\n

关键问题:Lambda 函数(及其同类方案)是无状态容器,仅存活几秒或几分钟。它们不会在内存中“保持”会话,也不会运行 Apache。因此,等待 $_GET 或写入 $_SESSION 的标准 PHP 脚本需要进行适配。

\n\n

解决方案以特殊运行时的形式出现。它们将 Lambda 事件(例如,来自 API Gateway 的 HTTP 请求)转换为熟悉的 PHP 上下文。最流行的工具是 Bref。

\n\n

Bref:AWS Lambda 的 PHP 引擎

\n\n

Bref 是一个开源项目,允许你“开箱即用”地在 AWS Lambda 上运行 PHP。它附带预构建的层(layers),包含 PHP 8.x 和流行的扩展(PDO、Redis、gd、mbstring)。

\n\n

安装与首次运行

\n\n

你需要准备:

\n
    \n
  • AWS 账户
  • \n
  • 已安装的 composer 和 aws-cli
  • \n
  • Node.js(用于 Serverless Framework)
  • \n
\n\n

让我们创建一个简单的函数,返回包含当前时间的 JSON:

\n\n
// index.php\n<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Bref\\Context\\Context;\nuse Bref\\Event\\Http\\HttpHandler;\n\nclass TimeHandler extends HttpHandler\n{\n    public function handleRequest($request, Context $context): array\n    {\n        return [\n            'statusCode' => 200,\n            'headers' => ['Content-Type' => 'application/json'],\n            'body' => json_encode([\n                'server_time' => date('Y-m-d H:i:s'),\n                'php_version' => PHP_VERSION,\n                'message' => 'Hello from Serverless PHP!'\n            ]),\n        ];\n    }\n}\n\nreturn new TimeHandler();
\n\n

现在配置部署。创建 serverless.yml 文件:

\n\n
# serverless.yml\nservice: php-time-api\n\nprovider:\n    name: aws\n    region: eu-central-1\n    runtime: provided.al2\n\nplugins:\n    - ./vendor/bref/bref\n\nfunctions:\n    api:\n        handler: index.php\n        timeout: 28\n        layers:\n            - ${bref:layer.php-81}\n        events:\n            - httpApi: 'GET /time'
\n\n

运行部署:

\n
composer require bref/bref\nserverless deploy
\n\n

一分钟后,你将获得一个类似 https://xxx.execute-api.eu-central-1.amazonaws.com/time 的 URL。在浏览器中打开它——你将看到 JSON。恭喜,你刚刚在 AWS Lambda 上成功运行了一个无服务器 PHP 函数!

\n\n

AWS Lambda 的 PHP 替代方案

\n\n

不想绑定在 AWS 上?还有其他与 PHP 兼容的替代方案。

\n\n

Google Cloud Functions(需适配)

\n\n

Google 原生不支持 PHP,但你可以

博客

书籍推荐