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

drr*_*lsn 6 php sockets zlib stream filter

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

我怎样才能解决这个限制?

Arn*_*anc 3

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

这将允许您在流上使用stream_select,并且管道将充当zlib 的缓冲区。

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

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);
}
Run Code Online (Sandbox Code Playgroud)

使用 php://memory 流也可以实现同样的效果。