このトピックでは、PHPランタイムのイベントハンドラーの構造と例について説明します。
イベントハンドラーの署名Signatures for event handlers
次のサンプルコードでは、イベントハンドラーの署名について説明します。
<?php
function handler($event, $context) {
return 'hello world';
}
パラメーターの説明:
handler
: メソッドの名前。 このメソッドは、Function ComputeコンソールのRequest Handlerパラメーターに指定された値に対応します。 たとえば、Function Compute関数のRequest Handlerパラメーターの値がindex.handler
の場合、function Computeはindex.php
で定義されているhandler
関数を読み込み、handler
関数から関数を実行します。$event
: 関数を呼び出すときに渡されるパラメーター。 このパラメーターの値はString型です。 PHP関数は、指定されたevent
パラメーターを直接使用します。 ビジネス要件に基づいて、関数内のイベント
を解析できます。 たとえば、入力データがJSON文字列の場合、JSON文字列を配列に変換できます。$context
: リクエストIDや一時的なID資格情報など、関数のランタイム情報。 コードでランタイム情報を使用できます。
例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: 一時的なAccessKeyペアを使用したOSS (Object Storage Service) リソースの読み取りと書き込み
サンプルコード
Function Computeが提供する一時キーペアを使用して、Object Storage Service (OSS) にアクセスできます。 例:
<?php
use OSS\OssClient;
use OSS\Core\OssException;
function handler($event, $context) {
/*
The AccessKey pair of an Alibaba Cloud account can be used to access 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 under 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プログラムを使用して、外部コマンドを呼び出すフォーク
プロセスを作成できます。
PHP関数でC ++ やGoでコンパイルされたシェルスクリプトや実行可能ファイルなど、PHP以外のツールを使用する場合は、ツールとコードを一緒にパッケージ化してアップロードし、外部コマンドを実行してこれらのツールを使用できます。 次の方法で外部コマンドを実行できます。 exec, システム、および shell_execを実行します。
次のサンプルコードは、Linuxでls -halt
コマンドを呼び出し、現在のディレクトリにあるファイルの詳細を生成するために使用されます。
<?php
function handler($event, $context) {
return shell_exec("ls -halt /code");
}