我正在使用以下简化的结构,但stream_get_meta_data总是返回0,这使我认为它不适用于stream_socket_server。客户端连接是长期存在的。
Man说它适用于“由fopen(),fsockopen()和pfsockopen()创建的任何流”。看起来没什么?
客户发送,例如使用fwrite的17KB字节(一次性使用)但是我的读取函数在8192之后终止,这会破坏json数据。
$master = stream_socket_server($url, $errno, $err, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
..
$socket = stream_socket_accept($master);
..
@stream_select([$socket] ...
..
ReadBuffer($socket);
function ReadBuffer($resource){
$buffsize = 8192; // <-- increasing this has no effect
do {
if(feof($resource)) {
return false;
}
$result = fread($resource, $buffsize);
if($result === false || feof($resource)) {
return false;
}
$buffer .= $result;
$unread = stream_get_meta_data($resource)['unread_bytes'];
$buffsize = ($unread > $buffsize) ? $buffsize : $unread;
} while($unread > 0);
}
如果是这种情况,是否有最佳选择?
编辑:使用wireshark似乎尽管发送fwrite报告在发送17KB时没有中断,但是线路上的内容是分块的。黑魔法?
更新:我放弃并更改为使用套接字扩展而非流。效果很好。有趣的是,17KB字符串仍然在tcp级别被分解,但是在socket_read到达它时被重新组装。 Wireshark显示重组PDU的TCP段。