PHP ハンドラを使用して、イベントに応答し、ビジネスロジックを実行できます。このトピックでは、PHP ハンドラの概念、構造、および例について説明します。
ハンドラの概要
FC 関数のハンドラは、お客様の機能コード内でリクエストを処理するメソッドです。お客様の FC 関数が呼び出されると、Function Compute は指定したハンドラを実行します。お客様は、Function Compute コンソールで ハンドラー パラメーターを設定して、ハンドラを構成できます。
FC の PHP 関数の場合、ハンドラは filename.methodname 形式である必要があります。たとえば、ファイル名が main.php で、メソッド名が handler の場合、ハンドラは main.handler になります。
FC 関数の定義の詳細については、「イベントトリガー関数の作成」をご参照ください。
ハンドラの構成は、Function Compute の構成仕様に準拠する必要があります。構成仕様はハンドラタイプによって異なります。
ハンドラシグネチャ
次のコードは、単純なハンドラシグネチャを定義しています。
<?php
function handler($event, $context) {
return 'hello world';
}パラメーターの説明は次のとおりです:
handler: メソッド名です。 これは、Function Compute コンソールで設定するハンドラーに対応します。 たとえば、FC 関数のハンドラーがindex.handlerに設定されている場合、Function Computeはindex.phpで定義されているhandler関数をロードし、handler関数から実行を開始します。$event:関数を呼び出すときに渡すパラメーターです。データ型は文字列です。PHP 関数は、前処理なしで指定されたeventパラメーターを直接使用します。必要に応じて、関数内でeventを解析できます。たとえば、入力データが JSON 文字列の場合、それを配列に変換できます。$context:リクエスト ID や一時的な認証情報など、関数のランタイム情報が含まれています。この情報をコードで使用できます。
HTTP トリガーまたはカスタムドメイン名を使用して関数にアクセスする場合は、HTTP 応答を定義する前にリクエスト構造体を取得してください。詳細については、「HTTP トリガーを使用した関数の呼び出し」をご参照ください。
例 1:JSON 形式のパラメーターの解析
サンプルコード
Function Compute は、JSON 形式のパラメーターを生の文字列として渡すため、コード内で解析する必要があります。次のサンプルコードは、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:OSS リソースへの安全なアクセス
サンプルコード
Function Compute からの一時的な認証情報を使用して、Object Storage Service (OSS) にアクセスできます。次のコードに例を示します。
<?php
use OSS\OssClient;
use OSS\Core\OssException;
function handler($event, $context) {
/*
Alibaba Cloud アカウントの AccessKey ペアは、すべての API オペレーションに対する完全な権限を付与します。API 呼び出しや日常のメンテナンスには、RAM ユーザーを使用することを推奨します。
AccessKey の漏洩リスクを軽減するため、プロジェクトコードに AccessKey ID と AccessKey Secret をハードコーディングしないことを推奨します。
この例では、コンテキストから認証情報を取得する方法を示しています。
*/
$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パラメーターから一時的な認証情報を取得します。この方法により、認証情報などの機密情報をコードにハードコーディングすることを回避できます。上記のコードは、
/code/index.phpファイルを OSS のrandombucketバケット内の exampledir ディレクトリにアップロードします。説明endpoint、bucket、object、およびfilePathを実際のりソース値に置き換えてください。
前提条件
OSS にアクセスする権限を持つロールを関数に設定済みであること。詳細については、「ロールを使用して Function Compute に他のクラウドサービスへのアクセス権限を付与する」をご参照ください。
PHP ランタイムを使用する関数を作成済みであること。詳細については、「イベントトリガー関数の作成」をご参照ください。
操作手順
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
トップナビゲーションバーで、リージョンを選択します。[関数] ページで、目的の関数をクリックします。
「関数詳細」ページで、コード タブをクリックし、コードエディタにサンプルコードを入力して、デプロイメントコード をクリックします。
説明サンプルコードでは、ハンドラは
index.phpのhandlerメソッドです。ご利用の関数のハンドラが異なる構成になっている場合は、ファイル名とメソッド名を構成に合わせて更新してください。関数のテスト をクリックします。
関数が実行されると、
hello worldが返されます。
例 3:外部コマンドの呼び出し
PHP プログラムは、プロセスを fork して外部コマンドを呼び出すこともできます。
PHP 関数で、シェルスクリプトや C++ または Go でコンパイルされた実行可能ファイルなど、他の言語で記述されたツールを使用する必要がある場合は、そのツールを関数コードと一緒にパッケージ化してアップロードできます。その後、関数から外部コマンドを実行してこれらのツールを呼び出すことができます。外部コマンドを呼び出す一般的な方法には、exec、system、shell_exec などがあります。
次のサンプルコードは、Linux コマンド ls -halt を実行して、/code ディレクトリの詳細な内容を一覧表示します。
<?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 トリガーの設定」をご参照ください。
操作手順
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
トップナビゲーションバーでリージョンを選択します。[関数] ページで対象の関数をクリックします。
関数詳細ページで、トリガー タブをクリックして、HTTP トリガーのパブリックエンドポイントを確認します。
次の cURL コマンドを実行して関数を呼び出します。
curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
エラー分析
このサンプルコードは、HTTP トリガーまたはカスタムドメイン名を使用した呼び出しをサポートしています。HTTP トリガーのリクエスト形式と一致しないイベントを使用してコンソールから関数をテストすると、エラーが発生します。
たとえば、コンソールで関数を呼び出し、リクエストパラメーターを "Hello, FC!" に設定し、関数のテストをクリックすると、関数は以下の応答を返します:
The request did not come from an HTTP Trigger, event: Hello FC!