关于 reusePort 和 listen() 的问题

7csn

当 reusePort=true 时,listen() 在子进程中执行;当 reusePort=false 时,listen() 在主进程执行。
如果系统不支持 reusePort:
1)listen() 改为在子进程中执行,有什么区别?
2)执行 stream_context_set_option($this->context, 'socket', 'so_reuseport', 1);  会产生不良结果吗?
 

2864 2 0
2个回答

blogdaren

1、true === reusePort 代表启用端口复用,正常情况下不同的多个进程是无法绑定监听同一个端口的,但是启用端口复用可以允许多个不同的进程监听同一个端口,而且会避免惊群效应。但启用的前提是PHP_VERSION >= 7.0
2、 stream_context_set_option($this->context, 'socket', 'so_reuseport', 1) 这是针对 socket 启用端口复用时的一个必备选项设置而已。

  • 7csn 2019-08-02

    若操作系统版本过低不支持端口复用,强行将 reusePort 设置为 true,workerman 能正常运行吗?
    其实还是那两个问题,系统不支持端口复用:
    1.子进程不fork父进程的listen(父进程不listen),而是自己单独listen,可以吗?
    1.子进程强行设置 stream_context_set_option($this->context, 'socket', 'so_reuseport', 1),workerman 能正常运行吗?

  • blogdaren 2019-08-02

    无法正常运行,你试下就知道了。如果不支持端口复用,那么多进程模型下,默认记住是默认不同的子进程是不允许单独listen监听同一个端口的,这个上面已经提及过;另外是父进程fork,不是子进程fork,子进程是继承父进程fork出来的listen套接字,这也是workerman在非端口复用机制下实现不同的子进程监听同一个端口的原理所在。

  • 随某人 2020-04-21

    @614:大佬,那么一个请求过来,比如开了 5 个子进程,哪个进程执行?轮询,还是一个一个执行.

  • blogdaren 2020-04-21

    @6972: 具体哪个进程受理当前连接这是由系统内核调度的,单进程内是串行受理的,多核多进程是可以看做是并行处理的。

  • 随某人 2020-04-21

    @614:thanks

随某人

大佬,那么一个请求过来,比如开了 5 个子进程,哪个进程执行?轮询,还是一个一个执行.

年代过于久远,无法发表回答
🔝