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\nPHP 如何在无服务器环境中运行?
\n\n关键问题:Lambda 函数(及其同类方案)是无状态容器,仅存活几秒或几分钟。它们不会在内存中“保持”会话,也不会运行 Apache。因此,等待 $_GET 或写入 $_SESSION 的标准 PHP 脚本需要进行适配。
解决方案以特殊运行时的形式出现。它们将 Lambda 事件(例如,来自 API Gateway 的 HTTP 请求)转换为熟悉的 PHP 上下文。最流行的工具是 Bref。
\n\nBref:AWS Lambda 的 PHP 引擎
\n\nBref 是一个开源项目,允许你“开箱即用”地在 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
让我们创建一个简单的函数,返回包含当前时间的 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 文件:
# 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运行部署:
\ncomposer require bref/bref\nserverless deploy\n\n一分钟后,你将获得一个类似 https://xxx.execute-api.eu-central-1.amazonaws.com/time 的 URL。在浏览器中打开它——你将看到 JSON。恭喜,你刚刚在 AWS Lambda 上成功运行了一个无服务器 PHP 函数!
AWS Lambda 的 PHP 替代方案
\n\n不想绑定在 AWS 上?还有其他与 PHP 兼容的替代方案。
\n\nGoogle Cloud Functions(需适配)
\n\nGoogle 原生不支持 PHP,但你可以