請問webman中我想在master進程中運行自定義代碼,比如訪問一個webapi,根據(jù)返回結(jié)果來定義一些環(huán)境、參數(shù)或者退出服務(wù),在哪里加比較優(yōu)雅呢,謝謝~
為了保證整個服務(wù)穩(wěn)定,master進程不允許有任何業(yè)務(wù)代碼。
設(shè)置bootstrap,每個進程啟動的時候會執(zhí)行bootstrap的啟動項
重啟有兩種:
第一種:php start.php restart,主進程也重啟那種
這種不支持自己重啟自己。需要沒有親緣進程去執(zhí)行才行。
第二種:子進程重啟,主進程不重啟,也就是reload
reload只需要在業(yè)務(wù)代碼中執(zhí)行 posix_kill( posix_getppid(), SIGUSR1); 即可
不確認你具體要做什么 ,具體要的是哪種重啟。
想做一種架構(gòu),一臺主服務(wù)器控制一些子服務(wù)器去做一些操作,比如停止、重啟某一臺子服務(wù)器的服務(wù)這種,子服務(wù)器會過一段時間查詢主服務(wù)器的命令,然后去執(zhí)行。。貌似不太好弄,自定義進程好像不能通知主進程去執(zhí)行停止、重啟這種方式?
原來做過交易,拋磚引玉!
【客戶自定義服務(wù)器】可以通過改動進程配置文件config/process.php
,比如請求http接口獲取要啟動的業(yè)務(wù)進程,合并數(shù)組后return即可。
【遙控器】webman項目的根目錄,單獨新建一個腳本文件,啟動一個worker,異步連接到中央服務(wù)器等待接收重啟指令。
其他自由發(fā)揮,比如接收 進程配置,直接改寫 上述的進程配置文件,然后給重啟指令即可。
另外,所有在composer.json文件的 autoload.files 加載的文件,都會優(yōu)先載入并運行;
意思就是,所有 autoload.files 文件加載運行后,才輪到 webman的start.php
感謝大佬回復(fù),不過有兩個小問題,1是composer.json文件的 autoload.files 加載的文件是可以等待HTTP阻塞調(diào)用并返回數(shù)據(jù)后再去運行webman的start.php吧?2是【遙控器】中,啟動的這個worker好像是子進程,子進程不能調(diào)用restart去重啟父進程。。
注意看題目,遙控器】webman項目的根目錄,單獨新建一個腳本文件,啟動一個worker;這個是獨立的兩個進程(master進程、worker進程),當然可以調(diào)用webman的 start.php
回復(fù):1是composer.json文件的 autoload.files 加載的文件是可以等待HTTP阻塞調(diào)用并返回數(shù)據(jù)后再去運行webman的start.php吧
答案:是的
不好意思大佬,今天才想起來,剛試了一下遙控器】這個方案,確實可行,腳本文件我用 exec(’start.php restart‘) 來啟動為webman,測試成功,但不知如何保持這個腳本文件后臺執(zhí)行,我想運行一個定時器每天去主服務(wù)器獲取指令(或建立個長連接),必須要后臺才行,不吝賜教~
在根目錄,創(chuàng)建一個【遙控器】腳本,單獨啟動
use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
// 每2.5秒執(zhí)行一次
$time_interval = 2.5;
Timer::add($time_interval, function()
{
//管理進程 todo...
});
};
// 運行worker
Worker::runAll();