このトピックでは、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
パラメーターのみが含まれます。 このパラメーターで指定された情報は、ハンドラーに指定されたコンテキスト
パラメーターの値と同じです。context
のinitializer
および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
メソッドが読み込まれます。
Serverless Devsの使用
Serverless Devsを使用してライフサイクルフックを設定する場合は、InitializerフックとPreStopフックの設定をs.yaml
ファイルに追加する必要があります。
初期化フック
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.initializerをfunctionに追加します。
PreStopフック
handlerフィールドとtimeoutフィールドを含むinstanceLifecycleConfig.preStopをfunctionに追加します。
サンプルコード:
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
インスタンスライフサイクルフックのログを表示する
ライフサイクルフックのログは、[ログ] で表示できます。
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-193c8b21303 1
サンプルプログラム
Function Computeは、InitializerフックとPreStopフックを使用するサンプルMySQLプログラムを提供します。 この例では、Initializerフックを使用して、環境変数からMySQLデータベースの構成を取得し、MySQLデータベースへの接続を作成してから、接続をテストします。 PreStopフックは、MySQL接続を閉じるために使用されます。 詳細については、「php72-mysql」をご参照ください。