ビジネス初期化
時には、プロセス起動後にビジネス初期化を行う必要があります。この初期化はプロセスのライフサイクルで一度だけ実行されます。たとえば、プロセス起動後にタイマーを設定したり、データベース接続を初期化したりします。以下にその説明を行います。
原理
実行フロー の説明に基づき、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";
});
}
}