protected static function monitorWorkers()
{
self::$_status = self::STATUS_RUNNING;
while (1) {
// Calls signal handlers for pending signals.
pcntl_signal_dispatch();
// Suspends execution of the current process until a child has exited, or until a signal is delivered
$status = 0;
$pid = pcntl_wait($status, WUNTRACED);
// Calls signal handlers for pending signals again.
pcntl_signal_dispatch();
。。。。。
}
pcntl_signal_dispatch是检察是否有未处理的信号,如果有的话调对应信号的回调函数。
pcntl_wait是进入睡眠,如果有子进程退出事件或者其它信号事件就会被唤醒返回,程序继续向下执行。
pcntl_wait返回后 首先pcntl_signal_dispatch检查,然后处理子进程退出事件(如果有进程退出的话)。
处理进程退出事件过程中可能会有新的信号到来,在没有调用pcntl_signal_dispatch时这些信号不会被处理,所以在下次pcntl_wait是进入睡眠前再检查一遍,避免后来的信号没有被处理。
请问那是不是pcntl_signal_dispatch()就检测到一次有信号后,就结束了。如果在继续监听的话,就需要在pcntl_signal_dispatch()一次?
对这个pcntl_signal_dispatch不是很好的理解,是一直监听系统是否有信号发送过来,还是监听到了一次后,就结束了
pcntl_signal_dispatch不是监听信号,是检查是否有未处理的信号。
感谢大神的回复,太感激了。虽然理解的还不够深入。想请问下,workerman是怎么实现master-worker模型的。请求来了,master知道了,怎么通知worker工作,怎么把请求转过去的呢,希望大神指点一二
客户端直接和worker进程通讯,master进程不做任何业务逻辑