Swoole笔记

当一个Swoole主进程启动时,会启动一个Manager进程,worker_num个Worker进程。Swoole中worker/task进程都是由Manager进程Fork并管理的。

Reactor线程负责维护客户端机器的TCP连接、处理网络IO、收发数据。Worker进程接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据数据。

Reactor由dispatch_mode决定向哪一个Worker投递数据。默认情况下,同一个fd的数据投递到固定的Worker进程。参见:Worker与Reactor通信模式dispatch_mode

Worker进程可以异步处理N个连接的数据。在同一个Worker进程内,变量是共享的,因为本质上,这个Worker进程就是一段PHP脚本在运行,不同的连接发送不同的数据来处理而已。不同的Worker进程内,变量是不共享的,虽然在你看来,都是你写的那一段PHP代码,但是它们运行在不同的进程里。所以,如果想所有的连接都能共享变量,就把worker_num设置成1。

如何让指定的连接投递到指定的Worker进程?将dispatch_mode设置成5,然后在onconnect/onopen回调中调用$server->bind($fd, $worker_id)。具体流程应该是Reactor先根据未知规则将连接投递的某一个Worker,Worker设置bind为N后,后续该连接的message将投递到第N个Worker。

发表评论

电子邮件地址不会被公开。

*