とzlibのフィルタを使用して、zlib.deflate
フィルタはstream_socket_pair()
によって生成されたソケットのペアを使用して動作していないようです。 2番目のソケットから読み取ることができるのは2バイトの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) ""
私は、データが全体的に3つのすべての回をダンプされると、正しくstream_filter_append()
への呼び出し、ストリームの書き込み/読み取り機能をコメントアウトした場合私がzlibでフィルタリングされたストリームをソケットのペアではなくファイルにすると、圧縮されたデータが正しく書き込まれます。したがって、両方の部品は正しくは別々に機能しますが、一緒には機能しません。これは私が報告しなければならないPHPバグですか、私の一部のエラーですか?
この質問はthis related questionに溶液から分岐しています。
ありがとうございます。私はRubyで同じプロジェクトを実装し、Zlib :: deflate()への第2引数として 'Zlib :: SYNC_FLUSH'を渡す必要がありました。私はこれが書き込みであると仮定し、書き込み後すぐにフラッシュします。 'PSFS_FLAG_FLUSH_INC'フラグがセットされている場合、PHPは' Z_SYNC_FLUSH'のみを使用していますが、あなたが言ったように、フラグビットは公開されていないようです。 – FtDRbwLXw6