このトピックでは、PHP でインスタンスのライフサイクルフックメソッドを実装して使用する方法について説明します。
背景情報
インスタンスのライフサイクルフックを実装および設定すると、Function Compute はライフサイクルイベントが発生したときに、対応するフックを呼び出します。PHP ランタイムは、Initializer と PreStop のインスタンスライフサイクルフックをサポートしています。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
インスタンスのライフサイクルフックの課金は、通常の関数呼び出しと同じです。ただし、その実行ログは [リアルタイムログ]、[関数ログ]、または [高度なログ] にのみ表示されます。[呼び出しリクエストリスト] にはフックのログは表示されません。詳細については、「インスタンスライフサイクルフックのログを表示する」をご参照ください。
Initializer フック
Initializer の例
Initializer フックは、関数インスタンスが開始された後、ハンドラが実行される前に実行されます。Function Compute は、インスタンスのライフサイクル中に Initializer フックが 1 回だけ正常に実行されることを保証します。Initializer フックの実行に失敗した場合、関数の呼び出しは失敗します。次の呼び出しでは、Function Compute は新しいインスタンスを作成して Initializer フックを実行します。
Initializer フックがタイムアウトまたは失敗した場合、サーバーは常に HTTP 200 ステータスコードを返します。初期化の失敗がエラーの原因であるかどうかを判断するには、X-Fc-Error-Type:InitializationError 応答ヘッダーまたは応答本文の errorMessage フィールドを確認してください。
Initializer フックには入力パラメーターが 1 つだけあります。$context は、ハンドラ と同じ方法で使用されます。
次のコードは、簡単な Initializer フックの例を示しています。
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?> my_initializer はイニシャライザーのコールバックメソッドの名前であり、Function Compute コンソールで設定する [イニシャライザーフック] と一致する必要があります。 たとえば、関数の [イニシャライザーフック] を main.my_initializer に設定した場合、Initializer プロパティが設定された後、Function Compute は main.php で定義されている my_initializer メソッドをロードします。
メソッドのシグネチャ
唯一の入力パラメーターは
contextです。このパラメーターの情報は、ハンドラのcontextパラメーターの情報と同じです。contextのフィールドinitializerとinitializationTimeoutは Initializer フック用に設計されています。Initializer フックを使用する場合、これらのフィールドは、関数に設定した [Initializer フック] と [Initializer フックのタイムアウト] の値に設定されます。それ以外の場合、フィールドは空になり、フックは有効になりません。値は返されません。
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 コンソールで、FC 関数の タブに移動して、[Initializer フック] と [PreStop フック] を設定します。詳細については、「インスタンスライフサイクルの設定」をご参照ください。フックのフォーマットは [ファイル名.メソッド名] です。以下に例を示します。
[Initializer フック] を
index.initializeに設定した場合、index.phpファイル内のinitializeメソッドを示します。[PreStop フック] を
index.preStopに設定した場合、index.phpファイル内のpreStopメソッドを示します。
Serverless Devs の使用
Serverless Devs を使用する場合、[Initializer フック] と [PreStop フック] の設定を s.yaml ファイルに追加します。
Initializer フック:
function 設定の下に instanceLifecycleConfig.initializer フィールドを追加します。このフィールドには、handler と timeout プロパティが含まれます。
PreStop フック:
function 設定の下に instanceLifecycleConfig.preStop フィールドを追加します。このフィールドには、handler と timeout プロパティが含まれます。
次のコードは例を示しています。
edition: 3.0.0
name: fcDeployApp
access: "default"
vars: # グローバル変数
region: "cn-hangzhou"
resources:
hello_world:
component: fc3 # コンポーネント名
props:
region: ${vars.region} # 変数の使用方法の詳細については、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: # 拡張機能
initializer: # Initializer フック
handler: index.my_initializer
timeout: 60
preStop: # PreStop フック
handler: index.preStop # ハンドラ
timeout: 60 # タイムアウト期間
Serverless Devs の YAML 構文の詳細については、「一般的な Serverless Devs コマンド」をご参照ください。
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは [ログ] で表示できます。
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーで、リージョンを選択します。[関数] ページで、ターゲット関数をクリックします。
関数の詳細ページで、[関数のテスト] タブをクリックし、[関数のテスト] をクリックしてから、 を選択します。
[ログ] タブでは、関数の呼び出しログと 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-193c8b213031
サンプルプログラム
Function Compute は、Initializer フックと PreStop フックを使用するサンプル MySQL プログラムを提供します。この例では、Initializer フックは環境変数から MySQL データベースの設定を取得し、MySQL データベースへの接続を作成してから、接続性をテストします。PreStop フックは MySQL 接続を閉じます。詳細については、「php72-mysql」をご参照ください。