open_eof_split

启用EOF自动分包。当设置open_eof_check后,底层检测数据是否以特定的字符串结尾来进行数据缓冲。但默认只截取收到数据的末尾部分做对比。这时候可能会产生多条数据合并在一个包内。

EOF切割需要遍历整个数据包的内容,查找EOF,因此会消耗大量CPU资源。假设每个数据包为2M,每秒10000个请求,这可能会产生20GCPU字符匹配指令。

参数类型

  • 布尔型,必须为 truefalse,传入其他类型数值会被强制转为布尔型

启用open_eof_split参数后,底层会从数据包中间查找EOF,并拆分数据包。onReceive每次仅收到一个以EOF字串结尾的数据包。

启用open_eof_split参数后,无论参数open_eof_check是否设置,open_eof_split都将生效。

open_eof_check 的差异

  • open_eof_check 只检查接收数据的末尾是否为 EOF,因此它的性能最好,几乎没有消耗
  • open_eof_check 无法解决多个数据包合并的问题,比如同时发送两条带有 EOF 的数据,底层可能会一次全部返回
  • open_eof_split 会从左到右对数据进行逐字节对比,查找数据中的 EOF 进行分包,性能较差。但是每次只会返回一个数据包
  1. array(
  2. 'open_eof_split' => true, //打开EOF_SPLIT检测
  3. 'package_eof' => "\r\n", //设置EOF
  4. )