为什么始终只有一个进程接收请求

pader

我在使用过程中发现自己不管怎么试,所有请求都打在一个进程上面。

然后自己写了个简单的示例,使用 sleep() 阻塞住进程,哪怕其中一个进程阻塞了,其它的请求依然打在这个进程上面,其它进程全部旁观。

我知道浏览器会保持连接,于是我打开多个不同的浏览器,还是这样。
我使用 curl 命令试了还是这样。

示例代码:

<?php

use Workerman\Worker;

require __DIR__.'/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:2346');
$worker->count = 2;
$worker->onMessage = function($connection, $request) {
    sleep(5);
    $connection->send('Block sleep 5 seconds.');
};

Worker::runAll();

不管怎么试,都只有一个进程接收了请求,我用两个浏览器,用 curl 命令,或者在两台IP不同的机器上发起,都是这样。

2098 5 0
5个回答

walkor

操作系统是?

  • 暂无评论
pader

Windows WSL2 的 Ubuntu,还有 FreeBSD。
截图是 FreeBSD 的,都一样。

  • 暂无评论
walkor

WSL2 的reusePort有bug。
设置 $worker->reusePort = false; 就好了

  • 暂无评论
pader

reusePort默认是关的吧?

  • walkor 2020-10-06

    默认开的

  • pader 2020-10-06

    FreeBSD不是WSL2中的啊,FreeBSD11.3是物理机中的。

pader

确实我关闭 reusePort 就好了,这个原来会自动判断在 Linux 上启用 reusePort,在 FreeBSD 上也被认为是 Linux 了。
好像除了 Windows 其它系统均被认为是 Linux,我很好奇为什么不用 PHP_OS 常量来做操作系统判断,而是用目录分割符来做判断。
这一块应该可以做的更好一点,另外 FreeBSD 的环境跟 MacOS 其实类似,希望把 FreeBSD 也考虑进去。

  • walkor 2020-10-06

    有判断php_uname('s'),你看下你的系统里php_uname('s')返回的是什么。

  • pader 2020-10-06

    @1:FreeBSD 中与 PHP_OS 返回的一样,都是 "FreeBSD"

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