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