回调函数中的 reactor_id 和 fd
最后更新于:2022-04-02 06:24:35
# 回调函数中的 reactor\_id 和 fd
[TOC]
服务器的`onConnect`、`onReceive`、`onClose`回调函数中会携带`reactor_id`和`fd`两个参数。
* `$reactor_id`是来自于哪个reactor线程
* `$fd`是`TCP`客户端连接的标识符,在`Server`实例中是唯一的,在多个进程内不会重复
* `fd`是一个自增数字,范围是`1 ~ 1600万`,fd超过`1600万`后会自动从`1`开始进行复用
* `$fd`是复用的,当连接关闭后`fd`会被新进入的连接复用
* 正在维持的TCP连接`fd`不会被复用
调用`swoole_server->send`/`swoole_server->close`函数需要传入`$fd`参数才能被正确的处理。如果业务中需要发送广播,需要用`apc`、`redis`、`MySQL`、`memcache`、`swoole_table`将`fd`的值保存起来。
~~~
function my_onReceive($serv, $fd, $reactor_id, $data) {
//向Connection发送数据
$serv->send($fd, 'Swoole: '.$data);
//关闭Connection
$serv->close($fd);
}
~~~
## fd 为什么使用整型
`$fd`使用整型而不是使用对象,主要原因是`Swoole`是多进程的模型,在`Worker`进程/`Task`进程中随时可能要访问某一个客户端连接,如果使用对象,那就需要进行`Serialize/Unserialize`。增加了额外的性能开销。`$fd`如果是整数那就可以直接存储传输被使用。
在`PHP`层可以自行将客户端连接封装成对象。面向对象的好处是可读性更好,对连接的操作可以封装到方法中。如
~~~
$connection->send($data);
$connection->close();
~~~
';