【发布时间】:2011-11-22 10:51:34
【问题描述】:
由于某种原因,zlib.deflate 过滤器似乎不适用于stream_socket_pair() 生成的套接字对。可以从第二个套接字读取的只有双字节的 zlib 标头,之后的所有内容都是 NULL。
例子:
<?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);
输出:
string(2) "x�"
string(0) ""
string(0) ""
如果我注释掉对stream_filter_append() 的调用,则流写入/读取功能正确,数据全部转储三次,并且如果我将 zlib 过滤流定向到文件而不是通过套接字对,压缩数据写入正确。因此,这两个部分分别正确运行,但不能一起运行。这是我应该报告的 PHP 错误,还是我自己的错误?
这个问题是从this related question的解决方案分支出来的。
【问题讨论】: