topic-advisor/php-lambda-runtime-api

一个用于封装 AWS Lambda 运行时 API 的 PHP 库

0.5.0 2020-05-25 05:10 UTC

This package is auto-updated.

Last update: 2024-09-25 15:43:49 UTC


README

一个用于封装 AWS Lambda 运行时 API 的 PHP 库

安装

使用 composer: composer require topic-advisor/php-lambda-runtime-api

工作原理

该库通过为每个 Lambda 请求实例化对象,并遍历提供的请求处理程序列表以找到请求的处理程序来工作。一旦找到,处理程序将处理请求并返回响应。

用法

1: 创建至少一个处理程序来处理对您的应用程序的请求,并实现 TopicAdvisor\Lambda\RuntimeApi\InvocationRequestHandlerInterface 接口。

<?php

namespace App;

use TopicAdvisor\Lambda\RuntimeApi\InvocationRequestHandlerInterface;
use TopicAdvisor\Lambda\RuntimeApi\InvocationRequestInterface;
use TopicAdvisor\Lambda\RuntimeApi\InvocationResponseInterface;
use TopicAdvisor\Lambda\RuntimeApi\Http\HttpRequestInterface;
use TopicAdvisor\Lambda\RuntimeApi\Http\HttpResponse;

class ApplicationHandler implements InvocationRequestHandlerInterface
{
    /**
     * @param InvocationRequestInterface $request
     * @return bool
     */
    public function canHandle(InvocationRequestInterface $request): bool
    {
        return $request instanceof HttpRequestInterface;
    }

    /**
     * @param InvocationRequestInterface $lambdaRequest
     * @return InvocationResponseInterface
     * @throws \Exception
     */
    public function handle(InvocationRequestInterface $lambdaRequest): InvocationResponseInterface
    {
        // Execute your application code and return an instance of InvocationResponseInterface
        
        $response = new HttpResponse($lambdaRequest->getInvocationId());
        $response->setStatusCode(200);
        $response->setHeaders(['content-type' => 'application/json']);
        $response->setBody('{"hello":"world"}');
        
        return $response;
    }
    
    /**
     * @param InvocationRequestInterface $request
     * @return void
     */
    public function preHandle(InvocationRequestInterface $request)
    {
        // Do any pre-request handling
    }

    /**
     * @param InvocationRequestInterface $request
     * @param InvocationResponseInterface $response
     * @return void
     */
    public function postHandle(InvocationRequestInterface $request, InvocationResponseInterface $response)
    {
        // Do any post-request handling such as unsetting variables, resetting services, etc
    }
}

2: 在您的项目根目录中创建一个 bootstrap 文件

#!/opt/bin/php
<?php

require __DIR__ . '/vendor/autoload.php';

use TopicAdvisor\Lambda\RuntimeApi\RuntimeApiLoop;


$loop = new RuntimeApiLoop();
$loop
    ->setHandlers([
        new App\ApplicationHandler(),
    ])
    ->run();

本地开发

可以在本地针对真实的 Lambda 请求进行开发。这是通过 CLI iva 交互式客户端实现的。

运行本地进程循环

1: 修改您的 bootstrap.php 以使用用于处理请求和响应的 Cli Client 类

#!/opt/bin/php
<?php

require __DIR__ . '/vendor/autoload.php';

use Symfony\Component\Dotenv\Dotenv;
use TopicAdvisor\Lambda\RuntimeApi\Client\CliClient;
use TopicAdvisor\Lambda\RuntimeApi\RuntimeApiLoop;

$options = [];
if (getenv('APP_LOCAL')) {
    if (!class_exists(Dotenv::class)) {
        throw new \RuntimeException('APP_ENV environment variable is not defined. You need to define environment variables for configuration or add "symfony/dotenv" as a Composer dependency to load variables from a .env file.');
    }
    (new Dotenv())->load(__DIR__.'/.env');
    $options[RuntimeApiLoop::OPTION_CLIENT_CLASS] = CliClient::class;
}

$loop = new TopicAdvisor\Lambda\RuntimeApi\RuntimeApiLoop($options);
$loop
    ->setHandlers([
        new App\ApplicationHandler(),
    ])
    ->run();

2: 从命令行执行启动文件

 $ APP_LOCAL=1 php bootstrap.php

3: 在提示符下,输入一个 JSON 编码的 Lambda 请求对象,然后按两次回车键

注意:请求可以跨越多行。CLI 客户端将等待直到它检测到两个空行。

Please enter a request:

{
  "body": "...",
  "resource": "/{proxy+}",
  "path": "/",
  "httpMethod": "GET",
  "isBase64Encoded": true,
  "queryStringParameters": {
    ...
  },
  "multiValueQueryStringParameters": {
    ...
  },
  "pathParameters": {
    ...
  },
  "stageVariables": {},
  "headers": {
    ...
  },
  "multiValueHeaders": {
    ...
  },
  "requestContext": {
    ...
  }
}


Response:

{
    "statusCode": 200,
    "multiValueHeaders": {
       ...
    },
    "headers": {
        ...
    },
    "body": "..."
}