我需要長期運行一個外部的可以執(zhí)行文件,它帶有一個rpc服務,然后在workerman里做一些定時器,定時請求rpc服務。我的想法是啟動兩個worker,第一個用來執(zhí)行外部的命令,worker啟動時啟動,worker退出時退出,另一個worker里做邏輯。
在第一個worker里,好像不適合使用exec等命令,因為這些命令是阻塞的。那么直接簡單使用exec呢?
我還使用symfony/process區(qū)異步執(zhí)行命令,但是該組件有一個超時配置項,無法關(guān)閉,不符合我的需求。
還有就是使用popen,但這樣無法很好地管理外部進程的狀態(tài)和輸出,且獲取輸出也是同步阻塞的,并非一個事件。
如果并且如果使用popen的話,有兩個問題,開發(fā)模式時,在stop回調(diào)中調(diào)動pclose關(guān)閉進程:
$worker->onWorkerStop = function ($worker) {
pclose($worker->process);
};
在終端中需要ctrl+c兩次才能完全退出。
而如果進入守護進程模式,使用stop命令退出,只能退出worker,不能正確關(guān)閉popen的外部命令!
workerman有沒有內(nèi)置類似的機制呢?