是stream_get_meta_data应该与stream_socket_server一起使用

时间:2015-11-19 05:14:11

标签: php sockets stream

我正在使用以下简化的结构,但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段。

0 个答案:

没有答案