旗下导航:搜·么
当前位置:网站首页 > PHP框架 > Swoole > 正文

swoole的onreceive不触发【swoole】,swoole

作者:搜搜PHP网发布时间:2019-12-15分类:Swoole浏览:83


导读:onReceive接收到数据时回调此函数,发生在worker历程中。函数原型:(引荐进修:swoole视频教程)functiononReceive(swool...

onReceive

接收到数据时回调此函数,发生在worker历程中。函数原型: (引荐进修: swoole视频教程)

function onReceive(swoole_server $server, int $fd, int $reactor_id, string $data);

$server,Server对象

$fd,TCP客户端衔接的唯一标识符

$reactor_id,TCP衔接地点的Reactor线程ID

$data,收到的数据内容,多是文本或许二进制内容

关于$fd和$reactor_id 细致的诠释

未开启自动协定选项,onReceive单次收到的数据最大为64K

开启了自动协定处置惩罚选项,onReceive将收到完全的数据包,最大不凌驾 package_max_length

支撑二进制花样,$data多是二进制数据

运用底层供应的open_eof_check/open_length_check/open_http_protocol,能够保证数据包的完全性

不运用底层的协定处置惩罚,在onReceive后PHP代码中自行对数据分析,兼并/拆分数据包。

比方:代码中能够增添一个 $buffer = array(),运用$fd作为key,来保留上下文数据。 每次收到数据举行字符串拼接,$buffer[$fd] .= $data,然后在推断$buffer[$fd]字符串是不是为一个完全的数据包。

默许情况下,同一个fd会被分配到同一个Worker中,所以数据能够拼接起来。运用dispatch_mode = 3时。

要求数据是抢占式的,同一个fd发来的数据大概会被分到差别的历程。所以没法运用上述的数据包拼接要领

关于粘包问题如SMTP协定,客户端大概会同时发出2条指令。在Server中大概一次性收到,这时候应用层须要自行拆包。SMTP是经由过程\r\n来分包的,所以营业代码中须要 explode("\r\n", $data)来拆分数据包。

如果是要求应对式的效劳,无需斟酌拆分数据的问题。原因是客户端在提议一次要求后,必需比及效劳器端返回当前要求的相应数据,才会提议第二次要求,不会同时发送2个要求

以上就是swoole的onreceive不触发的细致内容,更多请关注ki4网别的相干文章!

标签:swoole