【初期化クラスの実装】

はじめに

初期化クラスは、アプリ起動時に必要なデータ(UNITパラメータインスタンス)や処理(ログライター、緊急停止コールバック)を読み込むための実装を行うところで、専用のコマンドを使ってスキャフォールディングできます。SocketManagerクラスを使う場合に比べて、シリアライザーやコマンドディスパッチャーなどの実装は必要なくなりますので、より簡易的になります。

初期化クラスを生成するコマンドは以下の通り。
> php worker runtime:init InitForTest

[success] 初期化クラスの生成に成功しました (InitForTest)
                    

コマンドを実行する事でapp/InitClassの場所にInitForTestというクラス名でIInitRuntimeManagerインターフェースをimplementsした初期化クラスが生成されます。

以降では生成されたクラス内で実装が必要なインターフェースメソッドの内訳を見ていきます。

➤ログライター

error_logの標準関数やLoggerなどの有名なライブラリを使ってログを出力する事ができます。
イベントハンドラ(UNIT)内ではパラメータ経由で使いますので$param->logWriter('debug', ['アプリ起動' => $message])のように記述します。
【メソッド】getLogWriter(): Closure|string|null

【パラメータ】なし

【戻り値】
    Closure|string|null
    - ログ出力を行う場合: Closure
        パラメータ:
            $p_level - string - 必須 - ログレベル
                現状では以下のレベルが定義されています。
                debug
                info
                notice
                warning
                error
            $p_param - array  - 必須 - 出力内容
                連想配列の形式で以下のように指定します。
                ['メッセージ受信' => $message]
        戻り値: void
    - ログ出力を行う場合: string
        ヘルパー関数などの関数名
    - ログ出力を行わない場合: null
                    

public function getLogWriter()
{
    return function(string $p_level, array $p_param)
    {
        // ファイル名を設定
        $filename = date('Ymd');
        
        // 現在日付を含むログ内容を作成
        $now = date('Y-m-d H:i:s');
        $log = $now." {$p_level} ".print_r($p_param, true)."\n";

        // ログ出力(カレントパスはプロジェクトルートになる)
        error_log($log, 3, "./logs/runtime-manager/{$filename}.log");
    };
}
                    

※カレントパスはプロジェクトルートになるので./logs/debug.logのように指定します。
※このメソッドはフレームワークのライブラリからもコールされますので、イベントハンドラのログも含めて時系列で出力されます。

➤緊急停止コールバック

UNITで例外発生時に呼び出されるコールバックメソッドを実装します。
【メソッド】getEmergencyCallback(): Closure|string|null

【パラメータ】なし

【戻り値】
    Closure|string|null
    - 緊急停止コールバックを使う場合: Closure
        パラメータ:
            $p_param - RuntimeManagerParameter - 必須 - UNITパラメータクラスのインスタンス
                各イベントハンドラで共通の引数として使用されるインスタンス。
                RuntimeManagerParameterクラスを継承した拡張クラスを指定する事も可能。
        戻り値: なし
    - 緊急停止コールバックを使う場合: string
        ヘルパー関数などの関数名
    - 緊急停止コールバックを使わない場合: null
                    

public function getEmergencyCallback()
{
    return function(ParameterForRuntime $p_param)
    {
        // UNITパラメータクラスでファイルハンドルを管理している場合
        if(is_resource($p_param->dummy_fh))
        {
            fclose($p_param->dummy_fh);
        }
    };
}
                    


➤UNITパラメータインスタンス

UNITとしてのイベントハンドラを実行する時に渡されるUNITパラメータクラスのインスタンスを指定します。
基底クラスであるRuntimeManagerParameterクラスのインスタンスがデフォルトで指定されていますが、このクラスを継承した拡張クラスを使用する場合はそのインスタンスを戻り値に指定する必要があります。
ここで指定したインスタンスはそのままUNITの引数として使われますので、動的に増殖してメモリを圧迫する心配はありません。
【メソッド】getUnitParameter(): RuntimeManagerParameter|null

【パラメータ】なし

【戻り値】RuntimeManagerParameter|null
    - UNITパラメータクラスを使う場合: RuntimeManagerParameter
        各イベントハンドラで共通の引数として使用されるインスタンス。
        RuntimeManagerParameterクラスを継承した拡張クラスを指定する事も可能。
    - UNITパラメータクラスを使わない場合: null
                    

public function getUnitParameter(): ?RuntimeManagerParameter
{
    return new RuntimeManagerParameter();
}
                    

※UNITパラメータクラスの詳細については▶UNITパラメータクラスのページをご覧ください。


おわりに

生成されたクラスのインスタンスは、メイン処理クラス内で$manager->setInitRuntimeManager()メソッドに引き渡す事で適用されます。
複数の初期化クラスやメイン処理クラスを用意している場合は、アプリの実装内容によって最適なインスタンスを動的、あるいは静的に適用する事で柔軟なアプリ構築が可能になります。