PHP gọi hàm lambda

Tôi muốn triển khai Serverless Microservices(PHP) bằng AWS Lambda cho một trong các dự án của mình. Qua nghiên cứu, tôi tìm thấy một số gói hiện có có thể thực hiện nhiệm vụ này

Tôi tò mò về quy trình bên trong bộ chứa lambda. Vì vậy, tôi quyết định làm điều đó một mình

Vì vậy, hãy bắt đầu cuộc phiêu lưu…

điều kiện tiên quyết

  • Tài khoản AWS
  • Kiến thức cơ bản về AWS lambda, CloudWatch và API gateway

Chúng tôi sẽ tạo một lớp thời gian chạy trong AWS lambda chứa

  • nhị phân PHP
  • thời gian chạy. php
  • khởi động

Và chúng tôi sẽ tham chiếu nó trong hàm lambda

Thời gian chạy PHP

Chúng tôi đang sử dụng guzzlehttp để xử lý các yêu cầu lambda đến

Bạn có thể cài đặt nó bằng cách sử dụng,

composer require guzzlehttp/guzzle

trong thời gian chạy. php, thêm phụ thuộc nhà cung cấp cho guzzlehttp

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

Sau đó, tạo phương thức getNextRequest() để ghi lại các yêu cầu lambda. Trong phương pháp này, chúng tôi sẽ khởi tạo ứng dụng khách guzzlehttp và gửi yêu cầu tới AWS lambda

function getNextRequest()
{
$client = new \GuzzleHttp\Client();
return $client->get('http://' . $_ENV['AWS_LAMBDA_RUNTIME_API'] . '/2018-06-01/runtime/invocation/next');
}

Sau này, thêm một phương thức để gửi phản hồi tới AWS lambda

function sendResponse($invocationId, $response)
{
$client = new \GuzzleHttp\Client();
$client->post(
'http://' . $_ENV['AWS_LAMBDA_RUNTIME_API'] . '/2018-06-01/runtime/invocation/' . $invocationId . '/response',
['body' => json_encode($response)]
);
}

AWS_LAMBDA_RUNTIME_API là biến môi trường mặc định của AWS lambda, chúng ta không cần thiết lập. Tôi sẽ giải thích sau, tại sao chúng ta nên gửi phản hồi JSON tới AWS Lambda

Cuối cùng, sử dụng vòng lặp do-while, vòng lặp này sẽ chạy cho đến khi môi trường của AWS Lambda ngừng hoạt động. Sau đó, gọi cả hai phương pháp trên

do {      $request = getNextRequest();      $invocationId = $request->getHeader('Lambda-Runtime-Aws-Request-Id')[0];      $payLoad =  json_decode((string) $request->getBody(), true);      $data = [];      sendResponse($invocationId, $data);}while(true)

Ở đây dữ liệu là một mảng trống, vì vậy hãy chuẩn bị dữ liệu để gửi phản hồi tới AWS Lambda

Tạo một chỉ mục. tập tin php. Nó chứa một mã PHP đơn giản mà chúng tôi muốn chạy trong AWS lambda. Bạn có thể thêm mã của mình và chuyển kết quả dưới dạng $response vào thời gian chạy. php

$response = "Hello World";?>

Bây giờ chúng tôi sẽ đưa nó vào thời gian chạy. php như,

require_once $_ENV['LAMBDA_TASK_ROOT'].'/index.php';

Sau đó chuẩn bị $data như sau,

$headers['Content-type'] = "text/html; charset=UTF-8";
$statusCode = 200;
$content = $response;

Tôi đã chọn Loại nội dung là văn bản/html, vì tôi muốn chế độ xem HTML cho phản hồi của mình. Bạn có thể lấy loại nội dung theo yêu cầu của bạn

$data sẽ trông như thế này. Chúng tôi sẽ mã hóa nó bằng cách sử dụng json_encode của PHP trong sendResponse() để nhận phản hồi JSON

________số 8

Mã đầy đủ của thời gian chạy. php sẽ giống như bên dưới,

// This invokes Composer's autoloader so that we'll be able to use Guzzle and any other 3rd party libraries we need.require __DIR__ . '/vendor/autoload.php';// This is the request processing loop. Barring unrecoverable failure, this loop runs until the environment shuts down.do {    // Ask the runtime API for a request to handle.
$request = getNextRequest();
//Get invocationId and Payload from request.
$invocationId = $request->getHeader('Lambda-Runtime-Aws-Request- Id')[0];
$payLoad = json_decode((string) $request->getBody(), true); //include index.php file require_once $_ENV['LAMBDA_TASK_ROOT'].'/index.php';

$headers['Content-type'] = "text/html; charset=UTF-8";
$statusCode = 200;
$content = $response;
//Prepare response for runtime API.
$data = [
'statusCode' => $statusCode,
'isBase64Encoded' => false,
'headers' => $headers,
'body' => $content
];
// Submit the response back to the runtime API.
sendResponse($invocationId, $data);
} while (true);
function getNextRequest()
{
$client = new \GuzzleHttp\Client();
//Send request to lambda function.
return $client->get('http://' . $_ENV['AWS_LAMBDA_RUNTIME_API'] . '/2018-06-01/runtime/invocation/next');
}
function sendResponse($invocationId, $response)
{
$client = new \GuzzleHttp\Client();
//Get response from lambda function and send it to client.
$client->post(
'
http://' . $_ENV['AWS_LAMBDA_RUNTIME_API'] . '/2018-06-01/runtime/invocation/' . $invocationId . '/response',
['body' => json_encode($response)]
);
}

Để thực hiện thời gian chạy. php trong môi trường Lambda, chúng ta cần nhị phân PHP. Khi tôi cần giao diện UI, tôi sẽ sử dụng PHP_CGI. Chúng ta có thể sử dụng PHP nếu không yêu cầu giao diện

nhị phân PHP

Tôi đã xây dựng mã nhị phân PHP bằng amazonlinux. 2 hình ảnh docker. Bạn có thể tìm Full Code của nó trong Dockerfile

Bootstrap

Nó chứa một lệnh để thực thi thời gian chạy. php

Các tệp của Layer nằm trong thư mục /opt và các tệp của Hàm nằm trong thư mục /var/task

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

Một lần nữa, LAMBDA_TASK_ROOT là biến env được xác định trước của Lambda, có giá trị là thư mục gốc của hàm lambda là /var/task

Bươc cuôi

Tạo lớp Lambda và hàm lambda bằng AWS-CLI và triển khai mã PHP. Triển khai. sh chứa một kịch bản của nó

Tôi đã tạo một repo GitHub cho serverless-php, chứa ví dụ về hàm lambda

Sau khi triển khai cả lớp và chức năng, nó sẽ như bên dưới,

Lớp AWS Lambda

Hàm AWS Lambda

Hàm Lambda có một lớp thời gian chạy PHP như,

Tham chiếu lớp trong hàm AWS Lambda

Bây giờ là lúc chạy hàm Lambda đã triển khai

Mở hàm Lambda đã tạo và kiểm tra nó. Nếu mọi thứ đều ổn, nó sẽ hiển thị kết quả như sau,

Phản hồi hàm Lambda

Nếu chúng ta muốn sử dụng cổng API có chức năng Lambda, Như đã đề cập ở đây tại Phương thức phản hồi, phản hồi phải ở định dạng JSON

Bạn có thể định cấu hình CloudWatch để theo dõi nhật ký của các ứng dụng PHP

Thời gian chạy PHP tùy chỉnh của chúng tôi cũng cho phép triển khai các ứng dụng PHP Laravel và CodeIgniter bằng cách thực hiện một số cấu hình nhỏ như thay đổi trình điều khiển Phiên, Bộ nhớ cache và Nhật ký

Làm cách nào để gọi hàm AWS Lambda từ PHP?

Cách dễ nhất để thiết lập và chạy nhanh chóng là sử dụng Aws\Lambda\LambdaClient. factory() và cung cấp hồ sơ thông tin xác thực của bạn (thông qua tùy chọn hồ sơ) , giúp xác định tập hợp thông tin đăng nhập bạn muốn sử dụng từ ~/. tệp aws/thông tin xác thực (xem Sử dụng tệp thông tin xác thực AWS và hồ sơ thông tin xác thực).

Lambda có hoạt động với PHP không?

Có AWS Lambda hỗ trợ PHP với một chút tinh chỉnh . Dưới đây là một vài liên kết để giúp bạn bắt đầu.

Làm cách nào để gọi một hàm ẩn danh trong PHP?

Cú pháp. $var=function ($arg1, $arg2) { return $val; . Có dấu chấm phẩy sau định nghĩa hàm vì định nghĩa hàm ẩn danh là biểu thức. There is no function name between the function keyword and the opening parenthesis. There is a semicolon after the function definition because anonymous function definitions are expressions.

AWS có hỗ trợ PHP không?

Bắt đầu nhanh chóng sử dụng AWS với AWS SDK dành cho PHP . SDK là một thư viện PHP mã nguồn mở, hiện đại giúp dễ dàng tích hợp ứng dụng PHP của bạn với các dịch vụ AWS như Amazon S3, Amazon Glacier và Amazon DynamoDB.