Function Compute で PHP を使用するには、まず PHP 関数をハンドラとして定義する必要があります。ここでは、使用する PHP ハンドラとその定義について説明します。
概要
Function Compute は、HTTP リクエストの処理を容易にするために、HTTP トリガーを使用した PHP 関数の呼び出しをサポートしています。HTTP トリガー関数は、HTTP トリガーのハンドラとして知られています。現在、PHP 実行環境では次の 2 種類のハンドラをサポートしています。
共通のハンドラ
基本のハンドラは次のように定義されています。
<?php
function handler($event, $context) {
return "hello world";
}
関数名
handler
は、この関数を作成するときに指定した “handler” フィールドと一致している必要があります。たとえば、”handler” を index.handler
に設定した場合、Function Compute は、index.php
ファイルに定義されている handler
関数を読み込みます。
$event パラメーター
$event
パラメーターは、関数の入力パラメーターです。ハンドラ関数を呼び出すときは、このパラメーターを渡す必要があります。このパラメーターのデータ型は String です。PHP 関数は、指定した $event
パラメーターを前処理せず、そのまま使用します。 ニーズに応じて関数内の $event
パラメータを解析できます。たとえば、入力データが JSON 文字列の場合、このパラメーターを配列に変換できます。次の例をご参照ください。
$event
パラメーターの入力例を次に示します。{
"key": "value"
}
次のコードを使用して
$event
が返すvalue
を解析します。<?php
function handler($event, $context) {
$eventObj = json_decode($event, $assoc = true);
return $eventObj['key'];
}
$context パラメーター
$context
パラメーターには、 リクエスト ID (requestId
) および一時的なセキュリティ資格情報 (securityToken
) といった関数実行時の情報が含まれています。$context
のデータ型は Array で、$context
は次のように定義されます。
[
'requestId' => 'b1c5100f-819d-c421-3a5e-7782a27d8a33',
'credentials' => [
'accessKeyId' => 'STS.access_key_id',
'accessKeySecret' => 'access_key_secret',
'securityToken' => 'security_token',
],
'function' => [
'name' => 'my-func',
'handler' => 'index.handler',
'memory' => 128,
'timeout' => 10,
],
'service' =>[
'name' => 'my-service',
'logProject' => 'my-log-project',
'logStore' => 'my-log-store',
],
'region' => 'cn-shanghai',
'accountId' => '123456'
]
$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 バケットにアップロードします。
<?php
use OSS\OssClient;
function handler($event, $context) {
$accessKeyId = $context["credentials"]["accessKeyId"];
$accessKeySecret = $context["credentials"]["accessKeySecret"];
$securityToken = $context["credentials"]["securityToken"];
$endpoint = "oss-cn-shenzhen.aliyuncs.com";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$bucket = "my-bucket";
$object = "php.txt";
$content = "Hello fc!" ;
try {
$ossClient->putObject($bucket, $object, $content);
} catch (OssException $e) {
print($e->getMessage());
}
return 'sucess';
};
HTTP トリガーのハンドラ
ベーシックな HTTP トリガーのハンドラは次のように定義されます。
<?php
use RingCentral\Psr7\Response;
function handler($request, $context): Response{
/*
$body = $request->getBody()->getContents();
$queries = $request->getQueryParams();
$method = $request->getMethod();
$headers = $request->getHeaders();
$path = $request->getAttribute("path");
$requestURI = $request->getAttribute("requestURI");
$clientIP = $request->getAttribute("clientIP");
*/
return new Response(
200,
array(
"custom_header1" => "v1",
"custom_header2" => ["v2", "v3"],
),
"hello world"
);
}
$context パラメーター
$context パラメーターは、共通ハンドラに定義された $context パラメーターと同じです。
$request パラメーター
$request
のパラメーターは、HTTP メッセージのインターフェイスに関して PSR の規約に準拠しています。詳細については、「PSR-7-http-message」をご参照ください。 コーディング規約の詳細については「PSR Http Message」をご参照ください。
次に、$request
のメソッド例を示します。
<?php
$queries = $request->getQueryParams();
$method = $request->getMethod();
$headers = $request->getHeaders();
$path = $request->getAttribute("path");
$requestURI = $request->getAttribute("requestURI");
$clientIP = $request->getAttribute("clientIP");
$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-encoding
、connection
、keep-alive
、proxy-authorization
、te
、trailer
、transfer-encoding
の各フィールド、およびx-fc-
で始まるフィールドです。
$response パラメーター
$response
は、HTTP メッセージインターフェイスについて PSR 規約に準拠します。Response
のコンストラクターは次の通りです。
<?php
/**
* @param int $status Status code for the response, if any.
* @param array $headers Headers for the response, if any.
* @param mixed $body Stream body.
*/
public function __construct(
$status = 200,
array $headers = array(),
$body = null,
)
{
//...
}
body
フィールドは、 String または Stream にできます。body
フィールドが Stream の場合、本体は PSR-7-http-message
に定義された StreamInterface インターフェイスを実装する必要があります。
HTTP トリガーのハンドラの例
次に、HTTP トリガーのハンドラの $request
および Response
の使用例を示します。
use RingCentral\Psr7\Response;
function php_http_handler($request, $context): Response{
$body = $request->getBody()->getContents();
$queries = $request->getQueryParams();
$method = $request->getMethod();
$headers = $request->getHeaders();
$path = $request->getAttribute("path");
$requestURI = $request->getAttribute("requestURI");
$clientIP = $request->getAttribute("clientIP");
$params = array(
'method' => $method,
'clientIP' => $clientIP,
'requestURI' => $requestURI,
'path' => $path,
'queriesMap' => $queries,
'headersMap' => $headers,
'body' => $body,
);
$respHeaders = array('Content-Type' => 'application/json');
$respBody = json_encode($params);
return new Response(200, $respHeaders, $respBody);
}
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 ランタイム」をご参照ください。