如何将 PHP 的 stream_select() 与 zlib 过滤器一起使用?



我目前有一个用PHP编写的服务器守护进程,它接受传入的连接,并使用stream_socket_*函数为它们创建网络流,并使用stream_select()轮询活动流。我希望能够添加一个zlib过滤器(使用string_filter_append())到任意流,但是当我这样做时,我得到一个错误告诉我stream_select()不能用于轮询过滤的流。

如何绕过这个限制?

您可以使用管道,并将过滤器添加到管道中。

这将允许你在流上使用stream_select,管道将作为zlib的缓冲区。

从select()流中读取原始数据,将其写入管道,并在另一端读取解码数据:)

list($in, $out) = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0);
stream_filter_append($out, 'zlib.inflate', STREAM_FILTER_READ);
stream_set_blocking($out, 0);
while (stream_select(...)) {
    // assuming that $stream is non blocking
    stream_copy_to_stream($stream, $in);
    $decoded_data = stream_get_contents($out);
}

同样可以通过php://内存流来实现。

相关内容

  • 没有找到相关文章

最新更新