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

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

最終更新日:Apr 21, 2026

このトピックでは、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 Computemain.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 の共通コマンド」をご参照ください。

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

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

  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-193c8b213031

プログラム例

Function Compute は、Initializer フックと PreStop フックを使用する MySQL サンプルプロジェクトを提供しています。このサンプルでは、Initializer フックが環境変数から MySQL データベースの設定を読み取り、MySQL 接続を作成し、その接続性をテストします。PreStop フックは MySQL 接続を閉じます。詳細については、「php72-mysql」をご参照ください。