我需要长期运行一个外部的可以执行文件,它带有一个rpc服务,然后在workerman里做一些定时器,定时请求rpc服务。我的想法是启动两个worker,第一个用来执行外部的命令,worker启动时启动,worker退出时退出,另一个worker里做逻辑。
在第一个worker里,好像不适合使用exec等命令,因为这些命令是阻塞的。那么直接简单使用exec呢?
我还使用symfony/process区异步执行命令,但是该组件有一个超时配置项,无法关闭,不符合我的需求。
还有就是使用popen,但这样无法很好地管理外部进程的状态和输出,且获取输出也是同步阻塞的,并非一个事件。
如果并且如果使用popen的话,有两个问题,开发模式时,在stop回调中调动pclose关闭进程:
$worker->onWorkerStop = function ($worker) {
pclose($worker->process);
};
在终端中需要ctrl+c两次才能完全退出。
而如果进入守护进程模式,使用stop命令退出,只能退出worker,不能正确关闭popen的外部命令!
workerman有没有内置类似的机制呢?
试下 proc_open