我在db里面插入一條記錄,每條記錄代表代表一個進程, 如果有新的進程進來或者狀態(tài)更新, 那么需要新增進程/禁用相應的進程,這樣的功能應該如何實現(xiàn)呢?
簡單粗暴的方法就行通過php start.php restart -d
去執(zhí)行重啟命令, 但是因為db里面的數(shù)據(jù)是隨時可能發(fā)生變化的, 不能每次都去手動的執(zhí)行重啟, 因此想到了借鑒內(nèi)存溢出重啟/文件監(jiān)控的方案, posix_kill($ppid, SIGUSR1)
但是測試了下是直接重啟的當前進程, 我新增的進程不會,所以應該要如何搞呢, 有指令可以發(fā)送重啟的命令嗎? 測試過了reload不符合我的業(yè)務邏輯,必須用restart
這是我插件自定的process, kafkaConfig是DB讀出來的數(shù)據(jù)
$process = [];
foreach ($kafkaConfig as $value) {
if($value){
$process[$value['app_uid']] = [
'handler' => \app\queue\kafka\Events::class,
'count' => $value['count'], // 進程數(shù)
//'user' => $group_id,
//'group' => $group_id,
'constructor' => [
'groupId' => $value['app_uid'],
'partition' => $value['partition'],
'messageKey' => $value['messageKey'] ?? '',
]
];
}
}
return $process;
新起一個監(jiān)控進程monitor_kafka_config
檢測DB數(shù)據(jù)...發(fā)生改變,執(zhí)行一下命令
測試的命令
$ppid = posix_getppid();
$pid = posix_getpid();
posix_kill($ppid, SIGINT);
posix_kill($pid, SIGUSR1);
這是我的一些大致想法
1,是否真的需要重啟進程?能否以數(shù)據(jù)或者回調(diào)函數(shù)來驅(qū)動進程內(nèi)邏輯的執(zhí)行
2,是否可以使用自定義進程之類的方法,提前啟動需要的進程,然后進行進程分配,老大說的重啟單個進程 http://wtbis.cn/q/510
3,是否可以使用fork子進程的方法來創(chuàng)建進程并銷毀進程,只創(chuàng)建和銷毀進程,不重啟
這個我試過, 因為我process里面最終不是return 出來一個數(shù)組嗎? 動態(tài)的, kill掉并重啟的話只會重啟第一次渲染出來process, 比如說我首次動態(tài)啟動了5個進程, 然后這時候db增加了1個進程, 按理說kill掉主進程之后這時候應該會出來6個進程, 但是測試的時候并不會把新的進程自動啟動進來
既然這樣,你想辦法把進程數(shù)寫到服務器環(huán)境變量里或者寫到文件里,然后kill 掉所有的webman 進程,包括主進程,然后用supervisord拉起webman 主進程并讀取進程數(shù)量
也就是說把進程數(shù)量做持久化,然后主動殺死所有的webman進程,這個時候進程數(shù)還在,讀取進程數(shù),然后依賴docker 健康檢查或者supervisord 把webman 服務拉起來
首選 workerman
不支持業(yè)務調(diào)用 pcntl_fork
,進程一旦啟動就不能動態(tài)修改進程數(shù),想要根據(jù)數(shù)據(jù)庫變化進程數(shù)就只能重啟。
另外起一個 Workerman
,用 Timer
或者 workerman/redis-queue
,監(jiān)控數(shù)據(jù)庫變動,然后再去重啟 webman
。
我試過了, 報錯 Workerman[start.php] stopping ... worker[monitor_kafka_config:5099] exit with status 9 Workerman[start.php] has been stopped PHP Notice: fwrite(): write of 152 bytes failed with errno=32 Broken pipe in /data/wwwroot/cloud-events_test/vendor/workerman/workerman/Worker.php on line 2254
我配置了健康檢查,并將進程數(shù)作為環(huán)境變量傳入容器,在容器中手動通過,php start.php stop 停止容器,幾秒鐘后容器被健康檢查拉起
容器中,也能從環(huán)境變量讀取到進程數(shù),
現(xiàn)在就是怎么處理進程數(shù)的問題。
如上面老哥所說,再起個Workerman 進程維護進程數(shù)量,然后通過workman 定時器 拉起 webman 服務也很好
目前我通過這個方法,實現(xiàn)增減進程。
http://wtbis.cn/q/11025
用模型事件: