このトピックでは、PHP ランタイムでインスタンスライフサイクルフックを実装および使用する方法について説明します。
背景情報
インスタンスライフサイクルフックを実装および設定すると、特定のライフサイクルイベントが発生したときに、Function Compute が対応するフックを呼び出します。PHP ランタイムは、Initializer と PreStop の 2 つのインスタンスライフサイクルフックをサポートしています。詳細については、「インスタンスライフサイクルの設定」をご参照ください。
インスタンスライフサイクルフックの課金ルールは、通常のリクエスト呼び出しと同じです。ただし、実行ログは リアルタイムログ、関数ログ、または 詳細ログ でのみクエリできます。呼び出しリクエストリストには、これらのフックのログは表示されません。詳細については、「インスタンスライフサイクルフックのログの表示」をご参照ください。
Initializer フック
Initializer の例
Initializer フックは、関数インスタンスが起動した後、そのハンドラが実行される前に実行されます。Function Compute は、関数インスタンスのライフサイクル内で Initializer フックが最大 1 回正常に実行されることを保証します。最初の試行で Initializer フックが失敗した場合、関数の呼び出しは直ちに失敗します。次の呼び出しでは、新しい関数インスタンスが作成され、フックが再度実行されます。
Initializer フックがタイムアウトまたは失敗した場合、サーバーは常に HTTP 200 ステータスコードを返します。エラーが初期化の失敗によるものかどうかを判断するには、レスポンスヘッダーの X-Fc-Error-Type:InitializationError またはレスポンスボディの `errorMessage` フィールドを確認する必要があります。
Initializer フックは、単一の入力パラメーター $context を受け入れます。これは、ハンドラの context パラメーターと同じです。
以下は、最小限の Initializer フックです。
<?php
function my_initializer($context) {
$logger = $GLOBALS['fcLogger'];
$logger->info("hello world");
}
?> my_initializer は、イニシャライザフックメソッドの名前です。この名前は、Function Compute コンソールで Initializer フック に設定した値と一致する必要があります。たとえば、関数の Initializer フック を main.my_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;
}
?>PreStop フックのログは、関数に設定された Logstore でクエリできます。たとえば、次のクエリ文を使用して、関数のすべてのログを検索します。詳細については、「フックに関連するログのクエリ」をご参照ください。
<funcName> AND <ServiceName> AND qualifier: <VERSION>ライフサイクルフックの設定
コンソールでの設定
Function Compute コンソールでは、 セクションで FC 関数の Initializer フック と PreStop フック を設定できます。詳細については、「インスタンスライフサイクルの設定」をご参照ください。コールバックのフォーマットは [file_name.method_name] です。例:
Initializer フック を
index.initializeに設定して、index.phpファイル内のinitializeメソッドを呼び出します。PreStop フック を
index.preStopに設定して、index.phpファイル内のpreStopメソッドを呼び出します。
Serverless Devs を使用した設定
Serverless Devs を使用する場合は、Initializer フック と PreStop フック の設定を s.yaml ファイルに追加します。
Initializer フックの設定
function 設定に、handler および timeout フィールドを含む instanceLifecycleConfig.initializer フィールドを追加します。
PreStop フックの設定
handler および timeout フィールドを含む instanceLifecycleConfig.preStop フィールドを function 設定に追加します。
次のコードは設定例です。
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」をご参照ください。