最近测试买了台测试机,环境4核8G,然后就想着去跑一波swoole玩玩。

然后参考官方文档,下载了4.2.8的包,然后简单的搞了个WebSocket。

这时候坑就出来了

启用A浏览器刷新二次,发现可以拿到两个fd,请求实例。

这时候再启动B浏览器,却发现也只拿到两个fd,A浏览器的fd并不再请求集合里,但是下标却是相连的。

这时候唯一想到的原因,就是swoole的请求集合是一致的,因为下标相连。

但是进程之间被隔开了,这时候想到的原因会不会是swoole自身的进程模型跟传统的apahce,nginx等服务的进程模型不一样。

然后就去逛了一波官方,一无所获,也没有介绍进程模型。

最后去逛了一波技术论坛,最终发现,swoole的进程模型是跟机器核数有关系的,默认开启进程数是机器的对应核数,所以4核的机器,默认就开了4个work进程。

就是这个原因导致了A-B之间被隔开了。

最简单的方法是修改swoole的进程打开数:

  1. $this->_ws = new swoole_websocket_server($this->_host, $this->_port);
  2. $this->_ws->set([
  3. 'worker_num' => 1,
  4. ])

这样直接就能使用。

更合适的方法,是使用swoole的携程通信,处理一遍每一个请求与通信动作。

不然swoole的websocket只能做一些无查询行为的业务,做长连接会很麻烦。