edit-icon download-icon

PHP ハンドラ

最終更新日: Aug 27, 2019

Function Compute で PHP を使用するには、まず PHP 関数をハンドラとして定義する必要があります。ここでは、使用する PHP ハンドラとその定義について説明します。

概要

Function Compute は、HTTP リクエストの処理を容易にするために、HTTP トリガーを使用した PHP 関数の呼び出しをサポートしています。HTTP トリガー関数は、HTTP トリガーのハンドラとして知られています。現在、PHP 実行環境では次の 2 種類のハンドラをサポートしています。

共通のハンドラ

基本のハンドラは次のように定義されています。

  1. <?php
  2. function handler($event, $context) {
  3. return "hello world";
  4. }

関数名

handler は、この関数を作成するときに指定した “handler” フィールドと一致している必要があります。たとえば、”handler” を index.handler に設定した場合、Function Compute は、index.php ファイルに定義されている handler 関数を読み込みます。

$event パラメーター

$event パラメーターは、関数の入力パラメーターです。ハンドラ関数を呼び出すときは、このパラメーターを渡す必要があります。このパラメーターのデータ型は String です。PHP 関数は、指定した $event パラメーターを前処理せず、そのまま使用します。 ニーズに応じて関数内の $event パラメータを解析できます。たとえば、入力データが JSON 文字列の場合、このパラメーターを配列に変換できます。次の例をご参照ください。

  • $event パラメーターの入力例を次に示します。

    1. {
    2. "key": "value"
    3. }
  • 次のコードを使用して$eventが返すvalueを解析します。

    1. <?php
    2. function handler($event, $context) {
    3. $eventObj = json_decode($event, $assoc = true);
    4. return $eventObj['key'];
    5. }

$context パラメーター

$context パラメーターには、 リクエスト ID (requestId) および一時的なセキュリティ資格情報 (securityToken) といった関数実行時の情報が含まれています。$context のデータ型は Array で、$context は次のように定義されます。

  1. [
  2. 'requestId' => 'b1c5100f-819d-c421-3a5e-7782a27d8a33',
  3. 'credentials' => [
  4. 'accessKeyId' => 'STS.access_key_id',
  5. 'accessKeySecret' => 'access_key_secret',
  6. 'securityToken' => 'security_token',
  7. ],
  8. 'function' => [
  9. 'name' => 'my-func',
  10. 'handler' => 'index.handler',
  11. 'memory' => 128,
  12. 'timeout' => 10,
  13. ],
  14. 'service' =>[
  15. 'name' => 'my-service',
  16. 'logProject' => 'my-log-project',
  17. 'logStore' => 'my-log-store',
  18. ],
  19. 'region' => 'cn-shanghai',
  20. 'accountId' => '123456'
  21. ]

$context パラメーターには、次のフィールドがあります。

フィールド データ型 詳細
requestId String 現在のリクエストの ID。 このフィールドは通常、問題の追跡およびリクエスト数をカウントするために使用されます。
function Array 関数名、ハンドラ、関数メモリ、タイムアウト時間など、関数に関する基本情報が含まれています。
credentials Array サービスロールを引き継ぐときに Function Compute が取得する、一時的なセキュリティ資格情報 (SecurityToken) が含まれています。これらの資格情報は 15 分ごとに更新されます。 また、一時的なセキュリティ資格情報を使用して、OSS などの他の Alibaba Cloud サービスにアクセスすることもできます。これにより、コード内の AccessKey 資格情報がハードコードされるのを防ぎます。
service Array この関数が使われているサービスの詳細 (関連する Log Service のサービス名、ログプロジェクト、LogStore など) が含まれます。
region String 数が適用されるリージョン (cn-shanghai など) を表します。詳細については「リージョンとゾーン」をご参照ください。
accountId String 関数を呼び出す Alibaba Cloud アカウントの ID を表します。詳細については、「Alibaba Cloud アカウント ID の取得」をご参照ください。

共通ハンドラの例

一時的なセキュリティ資格情報は、ユーザーの識別情報とアクセス権限を検証するために使用されます。他の Alibaba Cloud サービス (OSSなど) にアクセスするときは、securityToken を指定する必要があります。次の例では、一時的なセキュリティ資格情報を使用して、TXT ファイルを OSS バケットにアップロードします。

  1. <?php
  2. use OSS\OssClient;
  3. function handler($event, $context) {
  4. $accessKeyId = $context["credentials"]["accessKeyId"];
  5. $accessKeySecret = $context["credentials"]["accessKeySecret"];
  6. $securityToken = $context["credentials"]["securityToken"];
  7. $endpoint = "oss-cn-shenzhen.aliyuncs.com";
  8. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
  9. $bucket = "my-bucket";
  10. $object = "php.txt";
  11. $content = "Hello fc!" ;
  12. try {
  13. $ossClient->putObject($bucket, $object, $content);
  14. } catch (OssException $e) {
  15. print($e->getMessage());
  16. }
  17. return 'sucess';
  18. };

HTTP トリガーのハンドラ

ベーシックな HTTP トリガーのハンドラは次のように定義されます。

  1. <?php
  2. use RingCentral\Psr7\Response;
  3. function handler($request, $context): Response{
  4. /*
  5. $body = $request->getBody()->getContents();
  6. $queries = $request->getQueryParams();
  7. $method = $request->getMethod();
  8. $headers = $request->getHeaders();
  9. $path = $request->getAttribute("path");
  10. $requestURI = $request->getAttribute("requestURI");
  11. $clientIP = $request->getAttribute("clientIP");
  12. */
  13. return new Response(
  14. 200,
  15. array(
  16. "custom_header1" => "v1",
  17. "custom_header2" => ["v2", "v3"],
  18. ),
  19. "hello world"
  20. );
  21. }

$context パラメーター

$context パラメーターは、共通ハンドラに定義された $context パラメーターと同じです。

$request パラメーター

$request のパラメーターは、HTTP メッセージのインターフェイスに関して PSR の規約に準拠しています。詳細については、「PSR-7-http-message」をご参照ください。 コーディング規約の詳細については「PSR Http Message」をご参照ください。

次に、$request のメソッド例を示します。

  1. <?php
  2. $queries = $request->getQueryParams();
  3. $method = $request->getMethod();
  4. $headers = $request->getHeaders();
  5. $path = $request->getAttribute("path");
  6. $requestURI = $request->getAttribute("requestURI");
  7. $clientIP = $request->getAttribute("clientIP");
  8. $body = $request->getBody()->getContents();
フィールド データ型 詳細
$headers Array HTTP クライアントからの Key-Value ペアが含まれています。Key-Value ペアは配列フィールドで、PSR-7 規約に準拠します。
$path String HTTP URL のパスを表します。
$queries Array HTTP URL のクエリ文字列には Key-Value ペアが含まれます。Value のフィールドは、String または Array です。
$method String HTTP メソッドを表します。
$clientIP String HTTP クライアントの IP アドレスを表します。
$requestURI String hostname を除外した URL を表します。
$body String HTTP リクエスト本体を表します。

注意
Function Compute はデフォルトでシステムフィールドを提供しますが、カスタムフィールドとして使用することはできません。デフォルトのシステムフィールドは、accept-encodingconnectionkeep-aliveproxy-authorizationtetrailertransfer-encoding の各フィールド、および x-fc- で始まるフィールドです。

$response パラメーター

$response は、HTTP メッセージインターフェイスについて PSR 規約に準拠します。Response のコンストラクターは次の通りです。

  1. <?php
  2. /**
  3. * @param int $status Status code for the response, if any.
  4. * @param array $headers Headers for the response, if any.
  5. * @param mixed $body Stream body.
  6. */
  7. public function __construct(
  8. $status = 200,
  9. array $headers = array(),
  10. $body = null,
  11. )
  12. {
  13. //...
  14. }

body フィールドは、 String または Stream にできます。body フィールドが Stream の場合、本体は PSR-7-http-message に定義された StreamInterface インターフェイスを実装する必要があります。

HTTP トリガーのハンドラの例

次に、HTTP トリガーのハンドラの $request および Response の使用例を示します。

  1. use RingCentral\Psr7\Response;
  2. function php_http_handler($request, $context): Response{
  3. $body = $request->getBody()->getContents();
  4. $queries = $request->getQueryParams();
  5. $method = $request->getMethod();
  6. $headers = $request->getHeaders();
  7. $path = $request->getAttribute("path");
  8. $requestURI = $request->getAttribute("requestURI");
  9. $clientIP = $request->getAttribute("clientIP");
  10. $params = array(
  11. 'method' => $method,
  12. 'clientIP' => $clientIP,
  13. 'requestURI' => $requestURI,
  14. 'path' => $path,
  15. 'queriesMap' => $queries,
  16. 'headersMap' => $headers,
  17. 'body' => $body,
  18. );
  19. $respHeaders = array('Content-Type' => 'application/json');
  20. $respBody = json_encode($params);
  21. return new Response(200, $respHeaders, $respBody);
  22. }

HTTP トリガーのハンドラの制限

リクエストの制限

次の制限を超過すると、システムは HTTP ステータスコード 400 およびエラーコード InvalidArgument を送出します。

コンポーネント 制限 HTTP ステータスコード エラーコード
headers ヘッダー内の Key-Value ペアすべてのサイズは 4 KB を超過してはなりません。 400 InvalidArgument
path パスコンポーネント、およびすべてのクエリパラメーターのサイズは 4 KB を超過してはなりません。
body リクエスト本体のサイズが 6 MB を超過してはなりません。

レスポンスの制限

次の制限を超過すると、システムは HTTP ステータスコード 502 および BadResponse のエラーコードを送出します。

コンポーネント 制限 HTTP ステータスコード エラーコード
headers ヘッダー内の Key-Value ペアすべてのサイズは 4 KB を超過してはなりません。 502 BadResponse
body リクエスト本体のサイズが 6 MB を超過してはなりません。

参照情報

詳細については「PHP ランタイム」をご参照ください。