PHP 无服务器架构:AWS Lambda 及后端无服务器替代方案

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

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

开始课程

PHP 无服务器:神话还是现实?

\n\n

当听到“无服务器函数”这个词时,第一反应通常是 Node.js 或 Python。PHP 似乎是一个存在于永恒 Apache 或 Nginx 中的庞然大物。但时代在变。如今,PHP 在无服务器架构中 已不再是稀奇事,而是数千个项目的实用工具。您可以编写微服务、处理 Webhook、调整图片大小,甚至运行完整的 API,而无需担心服务器、扩展问题以及为闲置资源付费。

\n\n

在本文中,我们将探讨 PHP 在 AWS Lambda 上 如何工作,有哪些替代方案(Bref、OpenFaaS、Vercel),最重要的是,我们将编写可以立即运行的真实代码。如果您是 PHP 开发者,并希望迈入现代云原生开发领域,那么您来对地方了。

\n\n

什么是无服务器,为什么 PHP 开发者需要它?

\n\n

无服务器(或 FaaS——函数即服务)是一种模型,您只需上传代码,提供商自行决定何时以及如何运行它。您只需为实际执行时间付费。没有虚拟机,没有 24/7 消耗内存的“Apache”。对于长期被视为“FTP 托管语言”的 PHP 来说,这无疑是一股清流。

\n\n

PHP 项目的优势:

\n
    \n
  • 节省成本——无需为单个脚本维护整个服务器。
  • \n
  • 自动扩展——Lambda 会在负载增加时自动创建函数副本。
  • \n
  • 部署简单——上传代码,即可运行。
  • \n
  • 微服务方法——可以将单体应用拆分为小型函数。
  • \n
\n\n

问题:PHP 原生不支持无服务器

\n\n

经典的 PHP 不是守护进程。它启动、执行脚本然后终止。这对 Lambda 来说是个问题:函数必须是“冷启动”并在毫秒内启动。普通的 PHP 启动缓慢(加载框架、自动加载、配置)。解决方案是 Bref。

\n\n

Bref——无服务器 PHP 的主要工具

\n\n

Bref 是一个开源 SDK 和运行时,它将 PHP 转变为原生 Lambda 函数。它将 PHP 编译为静态二进制文件(通过 bref/bref),从而实现即时冷启动。Bref 支持 Laravel、Symfony、Slim 以及任何自定义代码。

\n\n

Bref 如何工作?

\n

您编写一个普通的 PHP 类,实现 Bref\\Context\\Context 接口,Bref 负责处理 HTTP 请求。对于 API,一个函数就足够了。

\n\n

示例:用于生成二维码的 PHP 无服务器 API

\n

假设我们需要接收包含文本的 POST 请求,并返回 PNG 格式的二维码。编写函数如下:

\n\n
<?php\n// handler.php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Bref\\Context\\Context;\nuse Bref\\Event\\Http\\HttpHandler;\nuse chillerlan\\QRCode\\QRCode;\nuse chillerlan\\QRCode\\QROptions;\n\nclass QrGenerator extends HttpHandler\n{\n    public function handleRequest($request, Context $context): array\n    {\n        $body = json_decode($request->getBody()->getContents(), true);\n        $text = $body['text'] ?? 'Hello, Serverless!';\n        \n        $options = new QROptions([\n            'outputType' => QRCode::OUTPUT_IMAGE_PNG,\n            'imageBase64' => false,\n        ]);\n        \n        $qrcode = new QRCode($options);\n        $imageData = $qrcode->render($text);\n        \n        return [\n            'headers' => ['Content-Type' => 'image/png'],\n            'statusCode' => 200,\n            'body' => base64_encode($imageData),\n            'isBase64Encoded' => true,\n        ];\n    }\n}\n\nreturn new QrGenerator();
\n\n

通过 Bref 部署到 AWS Lambda

\n

安装 Bref CLI 并执行:

\n
composer require bref/bref\n./vendor/bin/bref init\n./vendor/bin/bref deploy
\n

完成。一分钟后,您将拥有一个 HTTPS 端点,

博客

书籍推荐