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网别的相干文章!