私は小さなWebSocketライブラリを書いていましたが、gzipサポートの追加は驚くほど簡単でした。 deflate_init()
//inflate_init()
/inflate_add()
の関数が実際にはPHP 7のみであったため、PHP 5環境でWebSocketサーバーを実行したいと考えていました。gzdecode()とinflate_add()との間のバイナリの相互運用性
私の問題は、deflate_add()
は、gzdeflate()
と少し異なる出力を生成します。これは以下のテストケースの1文字です。
deflate_add()
/inflate_add()
ベースのアプローチをして、ブラウザ完璧に動作し、のでgzdeflate()
の出力が不正です。私はgzdeflate()
/gzinflate()
は、さまざまな基本的なオプションを持つzlibを使用していると推測しています - 何かストリームの状態に関連する、多分?それはすべてが崩壊する原因となっています。
最終的に私は、PHP 5のzlib関数が "正しい"収縮したデータを出力することを納得できるかどうかを知りたいと思います。すべての
まず、私はPHP 7で使用deflate_init()
/deflate_add()
ベースのアプローチ:
$data = "ABC";
$ctx = deflate_init(ZLIB_ENCODING_RAW);
// unfortunately I can't find the gigantic blog post with example code
// that I learned from :(, but it contained the Ruby equivalent of the
// the substr() below. I blinked at it a bit but apparently this is how
// it's done.
$deflated = substr(deflate_add($ctx, $data, ZLIB_SYNC_FLUSH), 0, -4);
// $deflated is now "rtr\6\0"
$ictx = inflate_init(ZLIB_ENCODING_RAW);
$data2 = inflate_add($ictx, $deflated, ZLIB_NO_FLUSH);
// $data2 is now "ABC"
ここで私はgzdeflate()
/gzinflate()
を使用した場合に何が起こるかです:
$data = "ABC";
$deflated = gzdeflate($data, 9, ZLIB_ENCODING_RAW);
// $deflated is now "str\6\0"
$output = gzinflate($deflated);
// $output is now "ABC"
gzinflate()
inflate_add()
の出力はdata error
。 TL:DR:
print gzinflate("rtr\6\0")."\n"; // will bomb out
print gzinflate("str\6\0")."\n"; // prints "ABC"