我在使用过程中发现自己不管怎么试,所有请求都打在一个进程上面。
然后自己写了个简单的示例,使用 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不同的机器上发起,都是这样。
操作系统是?
Windows WSL2 的 Ubuntu,还有 FreeBSD。
截图是 FreeBSD 的,都一样。
WSL2 的reusePort有bug。
设置
$worker->reusePort = false;
就好了reusePort默认是关的吧?
默认开的
FreeBSD不是WSL2中的啊,FreeBSD11.3是物理机中的。
确实我关闭 reusePort 就好了,这个原来会自动判断在 Linux 上启用 reusePort,在 FreeBSD 上也被认为是 Linux 了。
好像除了 Windows 其它系统均被认为是 Linux,我很好奇为什么不用 PHP_OS 常量来做操作系统判断,而是用目录分割符来做判断。
这一块应该可以做的更好一点,另外 FreeBSD 的环境跟 MacOS 其实类似,希望把 FreeBSD 也考虑进去。
有判断php_uname('s'),你看下你的系统里php_uname('s')返回的是什么。
@1:FreeBSD 中与 PHP_OS 返回的一样,都是 "FreeBSD"