すべてのプロダクト
Search
ドキュメントセンター

Function Compute:ハンドラー

最終更新日:Aug 28, 2024

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 Computeindex.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ランタイムで関数を作成します。 詳細については、「イベント関数の作成」をご参照ください。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。

    説明

    上記のサンプルコードでは、ハンドラーはindex.phphandlerメソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。

  4. コードタブで、テスト機能の隣のアイコンをクリックします。テストパラメーターの設定ドロップダウンリストから、次のサンプルコードにテストパラメーターを入力し、OK. をクリックします。

    {
      "key1": "value1",
      "key2": "value2",
      "key3": {
        "v1": true,
        "v2": "bye",
        "v3": 1234
      }
    }
  5. テスト機能をクリックします。

    関数が実行されると、関数によってJSON形式のコンテンツが返され、key1key2、および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のrandombucketexampledirディレクトリにアップロードされることを示しています。

    説明

    endpointbucketobjectfilePathをリソースの実際の値に置き換えます。

あなたが始める前に

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[コード] タブをクリックします。 コードエディターで、上記のサンプルコードを入力し、[デプロイ] をクリックします。

    説明

    上記のサンプルコードでは、ハンドラーはindex.phphandlerメソッドです。 関数のハンドラーが異なる場合は、実際のハンドラー設定を使用します。

  4. テスト機能をクリックします。

    関数の実行後、実行結果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トリガーの設定」をご参照ください。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 機能の詳細ページで、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 [トリガー] ページで、HTTPトリガーのパブリックエンドポイントを取得します。

  4. curlで次のコマンドを実行して、関数を呼び出します。

    curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
    重要
    • HTTPトリガーの [認証方法] パラメーターが [認証なし] に設定されている場合、Postmanまたはcurlを使用して関数を呼び出すことができます。 詳細については、「手順」をご参照ください。

    • HTTPトリガーの [認証方法] パラメーターが [署名認証] または [JWT認証] に設定されている場合、署名方法またはJWT認証方法を使用して関数を呼び出すことができます。 詳細については、「認証」をご参照ください。

考えられるエラー

このサンプルコードは、HTTPトリガーまたはカスタムドメイン名を使用して呼び出すことができます。 API操作を使用しても、設定されたテストパラメーターがHTTPトリガーの要求形式要件に準拠していない場合、エラーが報告されます。

たとえば、リクエストパラメーターを "Hello, FC!" として設定した後、function Computeコンソールで [Test Function] をクリックして関数を呼び出すと、次のレスポンスが返されます。

The request did not come from an HTTP Trigger, event: Hello FC!