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 解释器。

Logo

云原生社区为您提供最前沿的新闻资讯和知识内容

更多推荐