使用 Bref 的 LambdaRuntime 在 AWS 上将 Swoole 协程作为函数异步运行
Swoole 将发布一些非常酷的东西,那就是它自己的 CLI。您可以使用 Swoole 发布的预编译二进制文件开始使用它,地址为https://github.com/swoole/swoole-src/releases/tag/v4.8.7。
对于这个项目,这里的技巧是:我们将与Bref 的LambdaRuntime一起提供 Swoole CLI 二进制文件,以提供由 Swoole 驱动的自定义 AWS lambda 运行时。
让我们开始吧。
创建一个目录来保存我们的文件:
mkdir swoole-lambda
cd swoole-lambda
进入全屏模式 退出全屏模式
带上 Swoole 的 IDE 助手,这样我们就可以在编辑器中完成代码:
composer require --dev swoole/ide-helper
进入全屏模式 退出全屏模式
然后我们已经可以将Bref带到操场上:
composer require bref/bref
进入全屏模式 退出全屏模式
Bref将为我们提供与 AWS Lambda 运行时通信的抽象。我们可以在我们的引导文件中调用它。引导文件是 lambda 运行时开始调用的地方:
#!/opt/bin/swoole-cli
<?php
use Bref\Context\Context;
use Bref\Runtime\LambdaRuntime;
use Swoole\Coroutine;
require_once __DIR__ . '/vendor/autoload.php';
$runtime = LambdaRuntime::fromEnvironmentVariable('swoole-cli');
$handler = require $_ENV['LAMBDA_TASK_ROOT'] . '/handler.php';
Coroutine\run(static function () use ($runtime, $handler): void {
while (true) {
$runtime->processNextEvent($handler);
}
});
进入全屏模式 退出全屏模式
AWS Lambda 会将我们bin/目录中的内容移动到/opt/bin,因此我们的 Swoole CLI 将在那里。这就是为什么我们可以将 Bootstrap PHP 应用程序创建为一个自执行脚本,该脚本将使用位于该路径的解释器。
让我们抓住它:
wget https://github.com/swoole/swoole-src/releases/download/v4.8.7/swoole-cli-v4.8.7-linux-x64.tar.xz
tar -xf swoole-cli-v4.8.7-linux-x64.tar.xz
mkdir bin
mv swoole-cli bin/
rm swoole-cli-v4.8.7-linux-x64.tar.xz
进入全屏模式 退出全屏模式
UPX来救援! 148MB 对于函数来说可能太大了。让我们使用 UPX 使其更小:
upx -9 bin/swoole-cli
进入全屏模式 退出全屏模式
-9告诉UPX使其尽可能小。这可能需要一段时间,但最终结果是一个 44MB 的二进制文件,大约是原始文件大小的 30%!
现在我们可以安全地创建我们的运行时 ZIP 文件:
zip -r runtime.zip bootstrap bin
进入全屏模式 退出全屏模式
并将其作为层上传到 AWS Lambda:
aws lambda publish-layer-version \
--layer-name swoole-runtime \
--zip-file fileb://runtime.zip \
--region us-east-1
进入全屏模式 退出全屏模式
现在让我们压缩我们的供应商文件:
zip -r vendor.zip vendor
进入全屏模式 退出全屏模式
并将其作为图层上传:
aws lambda publish-layer-version \
--layer-name swoole-lambda-vendor \
--zip-file fileb://vendor.zip \
--region us-east-1
进入全屏模式 退出全屏模式
上传图层后,我们就可以创建我们的函数了。
bootstrap需要的handler.php文件,保存着我们的函数代码:
<?php
declare(strict_types=1);
use Bref\Context\Context;
return static fn ($event, Context $context): string =>
'Hello ' . ($event['name'] ?? 'world');
进入全屏模式 退出全屏模式
压缩它:
zip -r function.zip handler.php
进入全屏模式 退出全屏模式
并创建:
aws lambda create-function \
--function-name swoole-lambda \
--handler handler.handler \
--zip-file fileb://function.zip \
--runtime provided \
--role arn:aws:iam::884320951759:role/swoole-lambda \
--region us-east-1 \
--layers arn:aws:lambda:us-east-1:884320951759:layer:swoole-runtime:1 \
arn:aws:lambda:us-east-1:884320951759:layer:swoole-lambda-vendor:1
进入全屏模式 退出全屏模式
好的,滚鼓。
让我们测试一下:
aws lambda invoke \
--function-name swoole-lambda \
--region us-east-1 \
--log-type Tail \
--query 'LogResult' \
--output text \
--payload $(echo '{"name": "Swoole"}' | base64) output.txt | base64 --decode
进入全屏模式 退出全屏模式
输出应该是这样的:
START RequestId: eaa39e02-b833-4f06-b18d-7e9a5b603a97 Version: $LATEST
END RequestId: eaa39e02-b833-4f06-b18d-7e9a5b603a97
REPORT RequestId: eaa39e02-b833-4f06-b18d-7e9a5b603a97 Duration: 3.67 ms Billed Duration: 4 ms Memory Size: 128 MB Max Memory Used: 115 MB
进入全屏模式 退出全屏模式
让我们看看结果:
cat output.txt
"Hello Swoole"
进入全屏模式 退出全屏模式
就这些了!
Bref抽象了与AWS Lambda 运行时接口的所有麻烦。内部使用curl_*其中Swoole 可以异步连接和制作!
当然,不用多说,Swoole CLI 项目也给我们带来了一个内置 Swoole(静态编译)的 PHP 解释器。
更多推荐
所有评论(0)