現(xiàn)在只要敲下 php start.php custom 后面不是 Workerman 指定的幾個(gè)命令,就會(huì)出現(xiàn):
php start.php custom
Usage: php yourfile <command> [mode]
Commands:
start Start worker in DEBUG mode.
Use mode -d to start in DAEMON mode.
stop Stop worker.
Use mode -g to stop gracefully.
restart Restart workers.
Use mode -d to start in DAEMON mode.
Use mode -g to stop gracefully.
reload Reload codes.
Use mode -g to reload gracefully.
status Get worker status.
Use mode -d to show live status.
connections Get worker connections.
希望 Workerman 新增一些自定義命令的方式,比如:
Worker::addCommand('custom', function() {
new MyOtherServer();
Worker::runAll();
}, 'Custom command information.');
workerman命令機(jī)制并不是想象的那么簡(jiǎn)單。它涉及到啟動(dòng)腳本進(jìn)程、主進(jìn)程、子進(jìn)程之前的相互通訊。
比如status命令,就是啟動(dòng)腳進(jìn)程判斷是status命令,然后給主進(jìn)程發(fā)送某個(gè)信號(hào),主進(jìn)程收到信號(hào)后把主進(jìn)程掌握的信息寫入磁盤,然后把信號(hào)發(fā)給所有子進(jìn)程,子進(jìn)程將自己的狀態(tài)寫入到磁盤,然后腳本進(jìn)程讀取磁盤數(shù)據(jù)輸出結(jié)果。
絕大部分php開發(fā)人員沒有多進(jìn)程編程經(jīng)驗(yàn),或者對(duì)workerman進(jìn)程模型不了解,無(wú)法考慮周全。比如new MyOtherServer();
,它應(yīng)該運(yùn)行在腳本進(jìn)程、主進(jìn)程、還是子進(jìn)程一般開發(fā)者都不清楚。從而導(dǎo)致workeman不可預(yù)期的行為。
這個(gè) MyOtherServer() 就是一個(gè) Worker,這里的意思就是通過不同的參數(shù)啟動(dòng)不同的 Worker,或者能夠自己獲取自定義傳參,從而判斷實(shí)例化哪個(gè) Worker 來實(shí)現(xiàn)不同的命令。
或者支持 start 之后的參數(shù),比如 php start.php start mycustom cli param,然后在程序里可以通過 Worker::getCustomParam() 之類的來獲取參數(shù)來做一些特殊的操作。
我現(xiàn)在碰到一個(gè)問題,就是我需要通過啟動(dòng) Workerman 處理一些事情,這些事情可能要處理幾秒鐘,也可能幾分鐘,希望處理完成后就退出相關(guān)的進(jìn)程,任務(wù)結(jié)束了。
然而 Workerman 似乎并不支持相關(guān)的操作,比如在 onWorkerStart 中有一個(gè) Timer::add() 在定時(shí)器內(nèi)部是 Worker::stopAll(),然而這個(gè) stopAll 并不是終止 Workerman,而是重啟所有子進(jìn)程。
現(xiàn)在有什么辦法可以啟動(dòng)臨時(shí)性的進(jìn)程來執(zhí)行任務(wù)?