由于某种原因,zlib.deflate
过滤器似乎不适用于由生成的套接字对stream_socket_pair()
。从第二个套接字中可以读取的只是双字节 zlib 标头,之后的所有内容均为 NULL。
Example:
<?php
list($in, $out) = stream_socket_pair(STREAM_PF_UNIX,
STREAM_SOCK_STREAM,
STREAM_IPPROTO_IP);
$params = array('level' => 6, 'window' => 15, 'memory' => 9);
stream_filter_append($in, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
stream_set_blocking($in, 0);
stream_set_blocking($out, 0);
fwrite($in, 'Some big long string.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string, take two.');
$compressed = fread($out, 1024);
var_dump($compressed);
fwrite($in, 'Some big long string - third time is the charm?');
$compressed = fread($out, 1024);
var_dump($compressed);
Output:
string(2) "x�"
string(0) ""
string(0) ""
如果我注释掉对stream_filter_append()
,流写入/读取功能正确,数据全部转储三次,如果我将 zlib 过滤流定向到文件而不是通过套接字对,则压缩数据将正确写入。因此,这两个部分单独工作时可以正常工作,但不能一起工作。这是我应该报告的 PHP 错误,还是我的错误?
这个问题从一个解决方案分支到这个相关问题 https://stackoverflow.com/questions/7207484/how-do-i-use-phps-stream-select-with-a-zlib-filter.