topic-advisor / php-lambda-runtime-api
一个用于封装 AWS Lambda 运行时 API 的 PHP 库
0.5.0
2020-05-25 05:10 UTC
Requires
- php: ^7.1.3
- ext-curl: *
- guzzlehttp/guzzle: ^6.3
- guzzlehttp/psr7: ^1.5
- monolog/monolog: *
- psr/log: ^1.1
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": "..."
}