open_eof_check

打开EOF检测,此选项将检测客户端连接发来的数据,当数据包结尾是指定的字符串时才会投递给Worker进程。否则会一直拼接数据包,直到超过缓存区或者超时才会中止。当出错时底层会认为是恶意连接,丢弃数据并强制关闭连接。

参数类型

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

此配置仅对STREAM类型的Socket有效,如TCPUnix Socket Stream

array(
    'open_eof_check' => true, //打开EOF检测
    'package_eof' => "\r\n", //设置EOF
)

常见的Memcache/SMTP/POP等协议都是以\r\n结束的,就可以使用此配置。开启后可以保证Worker进程一次性总是收到一个或者多个完整的数据包。

EOF检测不会从数据中间查找eof字符串,所以Worker进程可能会同时收到多个数据包,需要在应用层代码中自行explode("\r\n", $data) 来拆分数据包
1.7.15版本增加了open_eof_split配置项,支持从数据中查找EOF,并切分数据



  • Dean1213

    因为客户端发包受到限制,最大只能1400。所以服务端就设置了open_eof_check选项,按文档上说的,应该会根据package_eof来对包进行拼接。但是试了多次,基本都只收到1400的数据就直接投递给worker进程了。偶尔会有2800,更少的情况能收到完整包。 请问这个是因为超过缓存区,或者超时吗?如果是,那么超时时间怎么设置。

  • 墨尘

    经过测试,当服务端开启了open_eof_check、package_eof这两个参数,接收的数据最大应该不能超过2M。即使在服务端和客户端都把socket_buffer_size设置得大于2M,也是无效的。