PHPハンドラーを使用して、受信したイベントに応答し、対応するビジネスロジックを実行できます。 このトピックでは、PHPハンドラーの概念と構造について説明し、例を示します。
ハンドラーとは何ですか?
Function Computeの関数のハンドラーは、関数コードでリクエストを処理するメソッドです。 関数が呼び出されると、Function Computeは設定したハンドラーを使用してリクエストを処理します。 function Computeコンソールでhandlerパラメーターを指定することで、関数のハンドラーを設定できます。
Function ComputeのPHP関数のハンドラーは、File name.Method name
形式に従います。 たとえば、ファイル名がmain.php
で、メソッド名がhandler
の場合、ハンドラーはmain.handler
になります。
Function Computeの関数と関連する操作の詳細については、「イベント関数の作成」をご参照ください。
ハンドラーの設定は、Function Computeの設定仕様に準拠している必要があります。 設定の仕様は、ハンドラーの種類によって異なります。
ハンドラーの署名Signatures for handlers
次のサンプルコードは、ハンドラーの単純な署名を示しています。
<?php
function handler($event, $context) {
return 'hello world';
}
パラメーターの説明:
handler
: リクエストを処理するメソッドの名前。 このメソッドは、Function ComputeコンソールのRequest Handlerパラメーターに指定された値に対応します。 たとえば、Function Compute関数のHandlerパラメーターの値がindex.handler
の場合、Function Computeはindex.php
で定義されているhandler
メソッドを読み込み、handler
から関数を実行します。$event
: 関数を呼び出すときに渡されるパラメーター。 このパラメーターの値は文字列です。 PHP関数は、指定されたevent
パラメーターを直接使用します。 ビジネス要件に基づいて、関数内のイベント
を解析できます。 たとえば、入力データがJSON文字列の場合、JSON文字列を配列に変換できます。$context
: リクエストIDや一時的な資格情報などのコンテキスト情報。 情報はコードで使用できます。
HTTPトリガーまたはカスタムドメイン名を使用して関数にアクセスする場合は、HTTP応答を定義する前にリクエスト構造体を取得してください。 詳細については、「HTTPトリガーを使用した関数の呼び出し」をご参照ください。
例1: JSON形式のパラメーターの解析
サンプルコード
JSON形式のパラメーターをFunction Computeの関数に渡すと、Function Computeがパラメーターを通過し、コード内のパラメーターを解析する必要があります。 次のサンプルコードは、JSON形式のイベントを解析する方法の例を示しています。
<?php
function handler($event, $context) {
$v = json_decode($event, true);
var_dump($v['key1']);
var_dump($v['key2']);
var_dump($v['key3']);
return $v;
}
あなたが始める前に
PHPランタイムで関数を作成します。 詳細については、「イベント関数の作成」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。
説明上記のサンプルコードでは、ハンドラーは
index.php
のhandler
メソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。コードタブで、テスト機能の隣のアイコンをクリックします。テストパラメーターの設定ドロップダウンリストから、次のサンプルコードにテストパラメーターを入力し、OK. をクリックします。
{ "key1": "value1", "key2": "value2", "key3": { "v1": true, "v2": "bye", "v3": 1234 } }
テスト機能をクリックします。
関数が実行されると、関数によってJSON形式のコンテンツが返され、
key1
、key2
、およびkey3
の値がログ出力に出力されます。
例2: 一時的なAccessKeyペアを使用したOSSリソースの読み取りと書き込み
サンプルコード
Function Computeが提供する一時的なAccessKeyペアを使用して、Object Storage Service OSSにアクセスできます。 サンプルコード:
<?php
use OSS\OssClient;
use OSS\Core\OssException;
function handler($event, $context) {
/*
The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. Using these credentials to perform operations in Function Compute is a high-risk operation. We recommend that you use a RAM user to call API operations or perform routine O&M.
We recommend that you do not save the AccessKey ID and AccessKey secret in your project code. Otherwise, the AccessKey pair may be leaked and the security of all resources in your account may be compromised.
In this example, the AccessKey ID and AccessKey secret are obtained from the context.
*/
$creds = $context["credentials"];
$accessKeyId = $creds["accessKeyId"];
$accessKeySecret = $creds["accessKeySecret"];
$securityToken = $creds["securityToken"];
$endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";
$bucket= "randombucket";
$object = "exampledir/index.php";
$filePath = "/code/index.php";
try{
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$ossClient->uploadFile($bucket, $object, $filePath);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return $e->getMessage();
}
return 'hello world';
}
説明:
$creds = $context["credentials"]
では、$context
から一時的なAccessKeyペアを取得します。 これにより、パスワードなどの機密情報のハードエンコードが防止されます。上記のコードは、
/code/index.php
ファイルがOSSのrandombucket
のexampledirディレクトリにアップロードされることを示しています。説明endpoint
、bucket
、object
、filePath
をリソースの実際の値に置き換えます。
あなたが始める前に
OSSにアクセスする権限を持つロールを設定します。 詳細については、「他のAlibaba Cloudサービスへのアクセス権限付与」をご参照ください。
PHPランタイムで関数を作成します。 詳細については、「イベント関数の作成」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。
説明上記のサンプルコードでは、ハンドラーは
index.php
のhandler
メソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。テスト機能をクリックします。
関数の実行後、実行結果
hello world
が返されます。
例3: 外部コマンドの実行
PHPプログラムを使用して、外部コマンドを実行するfork
プロセスを作成できます。
PHP関数でC ++ やGoでコンパイルされたシェルスクリプトや実行可能ファイルなど、PHP以外のツールを使用する場合は、ツールとコードを一緒にパッケージ化してアップロードし、外部コマンドを実行してこれらのツールを使用できます。 外部コマンドを呼び出す一般的なメソッドには、 exec, システム、および shell_execを実行します。
次のサンプルコードは、Linuxでls -halt
コマンドを実行し、現在のディレクトリ内のファイルの詳細を出力するために使用されます。
<?php
function handler($event, $context) {
return shell_exec("ls -halt /code");
}
例4: HTTPトリガーを使用して関数を呼び出す
サンプルコード
<?php
function handler($event, $context) {
$logger = $GLOBALS['fcLogger'];
$logger->info('hello world');
$logger->info('receive event: ' . $event);
try {
$evt = json_decode($event, true);
if (is_null($evt['body'])) {
return "The request did not come from an HTTP Trigger, event: " . $event;
}
$body = $evt['body'];
if ($evt['isBase64Encoded']) {
$body = base64_decode($evt['body']);
}
return array(
"statusCode" => 200,
'headers' => array("Content-Type" => "text/plain"),
'isBase64Encoded' => false,
"body" => $body
);
} catch (Exception $e) {
$logger->error("Caught exception: " . $e->getMessage());
return "The request did not come from an HTTP Trigger, event: " . $event;
}
}
あなたが始める前に
上記のサンプルコードを使用して、PHPランタイムで関数を作成します。 関数のHTTPトリガーを作成します。 詳細については、「イベント関数の作成」および「HTTPリクエストで関数を呼び出すHTTPトリガーの設定」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 [トリガー] ページで、HTTPトリガーのパブリックエンドポイントを取得します。
curlで次のコマンドを実行して、関数を呼び出します。
curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
考えられるエラー
このサンプルコードは、HTTPトリガーまたはカスタムドメイン名を使用して呼び出すことができます。 API操作を使用しても、設定されたテストパラメーターがHTTPトリガーの要求形式要件に準拠していない場合、エラーが報告されます。
たとえば、リクエストパラメーターを "Hello, FC!"
として設定した後、function Computeコンソールで [Test Function] をクリックして関数を呼び出すと、次のレスポンスが返されます。
The request did not come from an HTTP Trigger, event: Hello FC!