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\nPHP 项目的优势:
\n- \n
- 节省成本——无需为单个脚本维护整个服务器。 \n
- 自动扩展——Lambda 会在负载增加时自动创建函数副本。 \n
- 部署简单——上传代码,即可运行。 \n
- 微服务方法——可以将单体应用拆分为小型函数。 \n
问题:PHP 原生不支持无服务器
\n\n经典的 PHP 不是守护进程。它启动、执行脚本然后终止。这对 Lambda 来说是个问题:函数必须是“冷启动”并在毫秒内启动。普通的 PHP 启动缓慢(加载框架、自动加载、配置)。解决方案是 Bref。
\n\nBref——无服务器 PHP 的主要工具
\n\nBref 是一个开源 SDK 和运行时,它将 PHP 转变为原生 Lambda 函数。它将 PHP 编译为静态二进制文件(通过 bref/bref),从而实现即时冷启动。Bref 支持 Laravel、Symfony、Slim 以及任何自定义代码。
Bref 如何工作?
\n您编写一个普通的 PHP 类,实现 Bref\\Context\\Context 接口,Bref 负责处理 HTTP 请求。对于 API,一个函数就足够了。
示例:用于生成二维码的 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 并执行:
\ncomposer require bref/bref\n./vendor/bin/bref init\n./vendor/bin/bref deploy\n完成。一分钟后,您将拥有一个 HTTPS 端点,