跪求群主讲解一下Workerman是如何调用libevent扩展库的视频教程

Tinywan

通过这个帖子:https://www.workerman.net/q/8196 主进程搞懂了,但是涉及到的子进程事件交给了event,想知道里面是怎么实现(主要是workerman如何调用控制的)

列如定时器Timer类

public static function init($event = null)
{
    // 如果是子进程,则赋予事件后直接退出
    if ($event) {
        self::$_event = $event;
        return;
    }
    // 这里是主进程(初始化)使用的是`pcntl_alarm`做定时。
    if (\function_exists('pcntl_signal')) {
        \pcntl_signal(\SIGALRM, array('\Workerman\Lib\Timer', 'signalHandle'), false);
    }
}

赋予事件后直接退出是怎么工作的呢

1128 3 2
3个回答

nitron

其实这个就是注册(init)用,具体处理逻辑是$event内,因为是子进程,所以具体调度由master process去处理

  • Tinywan 2022-04-06

    没听明白

  • nitron 2022-04-06

    这只是个初始化, return掉是因为即使在子进程, \function_exists('pcntl_signal')也是有效(true)的, 只是不起作用而已

  • Tinywan 2022-04-06

    想知道这个 self::$_event = $event; 里面的故事

blogdaren
  1. workerman支持各种网络事件库,比如业务代码层面手动切换Libevent库:
    Worker::$globalEvent = new \Workerman\Events\Libevent;
  2. workerman子进程的Timer实现用的是或者说依赖是各个底层网络事件库【比如:libevent、event、ev、swoole等等这些C或C++库】内置实现的定时器技术,都对应有的相应的PHP扩展API实现,所以调用对应API就完事儿了,这个事儿wokerman已经帮开发者早做好啦。
  3. 如果想了解更底层的这些网络事件库对Timer是怎么实现的,那就只好扒C/C++源码了。
  • Tinywan 2022-04-06

    太下面就是红黑树了,有点难

  • walkor 2022-04-06

    对,就是blogdaren说的那样

liziyu

mark

  • 暂无评论
年代过于久远,无法发表回答
🔝