ビジネス初期化

時には、プロセス起動後にビジネス初期化を行う必要があります。この初期化はプロセスのライフサイクルで一度だけ実行されます。たとえば、プロセス起動後にタイマーを設定したり、データベース接続を初期化したりします。以下にその説明を行います。

原理

実行フロー の説明に基づき、webmanはプロセス起動後にconfig/bootstrap.php(およびconfig/plugin/*/*/bootstrap.php)で設定されたクラスをロードし、クラスのstartメソッドを実行します。私たちはstartメソッドにビジネスコードを追加することで、プロセス起動後のビジネス初期化操作を完了できます。

プロセス

例えば、現在のプロセスのメモリ使用量を定期的に報告するためのタイマーを作成する場合、このクラスの名前をMemReportとします。

コマンドを実行

コマンド php webman make:bootstrap MemReport を実行して、初期化ファイル app/bootstrap/MemReport.php を生成します。

ヒント
あなたのwebmanに webman/console がインストールされていない場合は、コマンド composer require webman/console を実行してインストールしてください。

初期化ファイルの編集

app/bootstrap/MemReport.phpを編集し、内容は以下のようになります:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // コマンドライン環境か?
        $is_console = !$worker;
        if ($is_console) {
            // コマンドライン環境でこの初期化を実行したくない場合は、ここで直接戻る
            return;
        }

        // 10秒ごとに1回実行
        \Workerman\Timer::add(10, function () {
            // デモのため、出力を使用して報告プロセスの代わりとします
            echo memory_get_usage() . "\n";
        });

    }

}

ヒント
コマンドラインを使用する場合、フレームワークはconfig/bootstrap.phpで設定されたstartメソッドを実行します。私たちは$workerがnullかどうかを判断することで、コマンドライン環境であるかどうかを判断し、それに基づいてビジネス初期化コードを実行するか否かを決定できます。

プロセス起動時に設定

config/bootstrap.phpを開き、MemReportクラスを起動項目に追加します。

return [
    // ...ここでは他の設定が省略されています...

    app\bootstrap\MemReport::class,
];

これで、ビジネス初期化プロセスが完了しました。

補足説明

カスタムプロセスが起動した後も、config/bootstrap.phpで設定されたstartメソッドが実行されます。私たちは$worker->nameを使って現在のプロセスがどのプロセスであるかを判断し、さらに$worker->idを使用してどのプロセス番号であるかを判断し、そのプロセスでビジネス初期化コードを実行するかを決定することができます。たとえば、webmanの0号プロセスでのみ実行する場合、MemReport.phpの内容は以下のようになります:

<?php

namespace app\bootstrap;

use Webman\Bootstrap;

class MemReport implements Bootstrap
{
    public static function start($worker)
    {
        // コマンドライン環境か?
        $is_console = !$worker;
        if ($is_console) {
            // コマンドライン環境でこの初期化を実行したくない場合は、ここで直接戻る
            return;
        }

        // webmanの0号プロセスでのみ実行
        if ($worker->name != 'webman' && $worker->id != 0) {
            return;
        }

        // 10秒ごとに1回実行
        \Workerman\Timer::add(10, function () {
            // デモのため、出力を使用して報告プロセスの代わりとします
            echo memory_get_usage() . "\n";
        });

    }

}