業(yè)務(wù)初始化
有時我們需要在進程啟動后做一些業(yè)務(wù)初始化,這個初始化在進程生命周期只執(zhí)行一次,例如進程啟動后設(shè)置一個定時器,或者初始化數(shù)據(jù)庫連接等。下面我們將對此進行講解。
原理
根據(jù) 執(zhí)行流程 中的說明,webman在進程啟動后會加載config/bootstrap.php
(包括config/plugin/*/*/bootstrap.php
)中設(shè)置的類,并執(zhí)行類的start方法。我們在start方法中可以加入業(yè)務(wù)代碼,即可完成進程啟動后業(yè)務(wù)初始化操作。
流程
假設(shè)我們要做一個定時器,用于定時上報當(dāng)前進程的內(nèi)存占用,這個類取名為MemReport
。
執(zhí)行命令
執(zhí)行命令 php webman make:bootstrap MemReport
生成初始化文件 app/bootstrap/MemReport.php
提示
如果你的webman沒有安裝webman/console
,執(zhí)行命令composer require webman/console
安裝
編輯初始化文件
編輯app/bootstrap/MemReport.php
,內(nèi)容類似如下:
<?php
namespace app\bootstrap;
use Webman\Bootstrap;
class MemReport implements Bootstrap
{
public static function start($worker)
{
// 是否是命令行環(huán)境 ?
$is_console = !$worker;
if ($is_console) {
// 如果你不想命令行環(huán)境執(zhí)行這個初始化,則在這里直接返回
return;
}
// 每隔10秒執(zhí)行一次
\Workerman\Timer::add(10, function () {
// 為了方便演示,這里使用輸出代替上報過程
echo memory_get_usage() . "\n";
});
}
}
提示
在使用命令行時,框架也會執(zhí)行config/bootstrap.php
配置的start方法,我們可以通過$worker
是否是null來判斷是否是命令行環(huán)境,從而決定是否執(zhí)行業(yè)務(wù)初始化代碼。
配置隨進程啟動
打開 config/bootstrap.php
將MemReport
類加入到啟動項中。
return [
// ...這里省略了其它配置...
app\bootstrap\MemReport::class,
];
這樣我們就完成了一個業(yè)務(wù)初始化流程。
補充說明
自定義進程啟動后也會執(zhí)行config/bootstrap.php
配置的start方法,我們可以通過$worker->name
來判斷當(dāng)前進程是什么進程,然后決定是否在該進程執(zhí)行你的業(yè)務(wù)初始化代碼,例如我們不需要監(jiān)控monitor進程,則MemReport.php
內(nèi)容類似如下:
<?php
namespace app\bootstrap;
use Webman\Bootstrap;
class MemReport implements Bootstrap
{
public static function start($worker)
{
// 是否是命令行環(huán)境 ?
$is_console = !$worker;
if ($is_console) {
// 如果你不想命令行環(huán)境執(zhí)行這個初始化,則在這里直接返回
return;
}
// monitor進程不執(zhí)行定時器
if ($worker->name == 'monitor') {
return;
}
// 每隔10秒執(zhí)行一次
\Workerman\Timer::add(10, function () {
// 為了方便演示,這里使用輸出代替上報過程
echo memory_get_usage() . "\n";
});
}
}