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

Function Compute:関数インスタンスのライフサイクルフック

最終更新日:Jul 24, 2024

このトピックでは、PHPランタイムで関数インスタンスのライフサイクルフックを実装する方法について説明します。

背景

関数インスタンスのライフサイクルフックを実装および設定した後、対応するインスタンスのライフサイクルイベントが発生すると、Function Computeがフックを呼び出します。 PHPランタイムでは、関数インスタンスのInitializerフックとPreStopフックを設定できます。 詳細は、「関数インスタンスのライフサイクル」をご参照ください。

関数インスタンスのライフサイクルフックの課金ルールは、一般的な呼び出し要求の課金ルールと同じです。 ただし、実行ログは、関数ログリアルタイムログ、および高度なログでのみ照会できます。 ライフサイクルフックのログは、呼び出し要求リストに表示されません。 詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。

初期化フック

Initializerフックは、関数インスタンスが開始された後、ハンドラが実行される前に呼び出されます。 Function Computeは、関数インスタンスのライフサイクル内で1回だけInitializerフックが正常に呼び出されるようにします。 Initializerフックの呼び出しに失敗した場合、システムはInitializerフックが正常に呼び出されるまでInitializerフックを再試行し、ハンドラーを実行します。 Initializerフックを繰り返し再試行できるようにするには、Initializerフックを適切に設定します。

Initializerフックには $contextパラメーターのみが含まれ、ハンドラーと同じ方法で使用できます。

次のサンプルコードは、単純なInitializerフックの例を示しています。

<?php
function my_initializer($context) {
    $logger = $GLOBALS['fcLogger'];
    $logger->info("hello world");
}
?>            

上記のサンプルコードでは、my_initializerはInitializerフックのメソッド名です。 メソッド名は、function Computeコンソールで関数に設定されているInitializer Hookパラメーターの値と同じである必要があります。 たとえば、Initializer Hookパラメーターの値がmain.my_initializerの場合、Function Computeは、initializerプロパティの設定後にmain.phpファイルで定義されているmy_Initializerメソッドを読み込みます。

メソッド署名

  • Initializerフックにはcontextパラメーターのみが含まれます。 このパラメーターで指定された情報は、ハンドラーに指定されたコンテキストパラメーターの値と同じです。

  • contextinitializerおよびinitializationTimeoutパラメーターは、Initializerフックに使用されます。 Initializerフックを使用する場合は、2つのパラメーターを、関数に設定したInitializer hookパラメーターとInitializer Hook Timeout Periodパラメーターの値に設定します。 それ以外の場合、値は空になり、フックは有効になりません。

  • 値は返されません。

PreStopフック

関数インスタンスが破棄される前に、PreStopフックが実行されます。 PreStopフックのメソッド署名は、Initializerフックのメソッド署名と同じです。

次のサンプルコードは、PreStopフックの例を示しています。

<?php

$counter = 0;
function preStop($context) {
    $GLOBALS['fcLogger']->info("preStop ok");
}

function handler($event, $context) {
    global $counter;
    $counter += 2;
    return $counter;
}
?>

関数用に設定されているLogstoreでPreStopフックのログを照会できます。 たとえば、次の形式のステートメントを使用して、関数のすべてのログを照会できます。 詳細については、「フックに関するクエリログ」をご参照ください。

<funcName> AND <ServiceName> AND qualifier: <VERSION>

ライフサイクルフックの設定

Function Computeコンソールの使用

[Initializer Hook] および [PreStop Hook] パラメーターは、function Computeコンソールの関数の FC タブで設定できます。 詳細については、「」をご参照ください。 フックの形式は [ファイル名. メソッド名] です。 例:

  • Initializer Hookパラメーターをindex.initializeに設定すると、index.phpファイルのinitializeメソッドが読み込まれます。

  • PreStop Hookパラメーターをindex.preStopに設定すると、index.phpファイルのpreStopメソッドが読み込まれます。

db-php-lifecycle

Serverless Devsの使用

Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックPreStopフックの設定をs.yamlファイルに追加する必要があります。

  • 初期化フック

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerfunctionに追加します。

  • PreStopフック

    handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopfunctionに追加します。

サンプルコード:

edition: 3.0.0
name: fcDeployApp
access: "default"

vars: # The global variables
  region: "cn-hangzhou"

resources:
  hello_world:
    component: fc3 # The name of the component
    props:
      region: ${vars.region}              # For information about how to use variables, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.
      functionName: "testphp"
      description: 'this is a test'
      runtime: "php7.2"
      code: ./
      handler: index.handler
      memorySize: 128
      timeout: 30
      instanceLifecycleConfig:      # The extension function
        initializer:                # The Initializer hook
          handler: index.my_initializer 
          timeout: 60     
        preStop:                    # The PreStop hook
          handler: index.preStop    # The handler
          timeout: 60               # The timeout period
 

Serverless DevsのYAML構文の詳細については、「」をご参照ください。

インスタンスライフサイクルフックのログを表示する

ライフサイクルフックのログは、[ログ] で表示できます。

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

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

  3. 関数の詳細ページで、テスト機能タブをクリックします。テスト機能を選択し、ログ > 関数ログ.

    [ログ] タブでは、関数呼び出しログとInitializerログを表示できます。 例:

    2024-03-04 17:57:28FC Initialize Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:282024-03-04 09:57:28.192 1-65e59b07-1520da26-bf73bbb91b69 [info] initializer
    2024-03-04 17:57:28FC Initialize End RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:28FC Invoke Start RequestId: 1-65e59b07-1520da26-bf73bbb91b69
    2024-03-04 17:57:28FC Invoke End RequestId: 1-65e59b07-1520da26-bf73bbb91b69

    各関数インスタンスは一定期間キャッシュされ、すぐには破棄されません。PreStopフックのログをすぐに表示することはできません。 PreStopフックをすばやくトリガーするには、関数設定または関数コードを更新します。 更新が完了すると、関数ログでPreStopフックのログを表示できます。 次のサンプルコードは例を示しています。

    2024-03-04 18:33:26FC PreStop Start RequestId: 93c93603-9fbe-4576-9458-193c8b213031
    2024-03-04 18:33:262024-03-04 10:33:26.077 93c93603-9fbe-4576-9458-193c8b213031 [info] preStop
    2024-03-04 18:33:26FC PreStop End RequestId: 93c93603-9fbe-4576-9458-193c8b21303 1 

サンプルプログラム

Function Computeは、InitializerフックとPreStopフックを使用するサンプルMySQLプログラムを提供します。 この例では、Initializerフックを使用して、環境変数からMySQLデータベースの構成を取得し、MySQLデータベースへの接続を作成してから、接続をテストします。 PreStopフックは、MySQL接続を閉じるために使用されます。 詳細については、「php72-mysql」をご参照ください。