質問
2つのPHPスクリプトを使用して移動する大量のデータがあります。1つはコマンドラインPHPスクリプトを使用するクライアント側、もう1つはApacheの背後にあります。サーバー側にデータをPOSTし、php:// inputストリームを使用してWebサーバー側に保存します。メモリ制限に達するのを防ぐために、データは各POSTリクエストごとに500kBのチャンクに分割されます。これはすべて正常に動作します。
今、帯域幅を節約して高速化するために、送信前にデータを圧縮し、相手側で受信したときに解凍したいと思います。私は仕事をすることができる機能の3つのペアを見つけましたが、私はどちらを使用するか決定できません:
どの機能のペアをお勧めしますか?その理由は何ですか?
更新: zlib FAQを読みました:
gzip形式( gzencode
)は、名前や最終変更日など、単一ファイルに関するディレクトリ情報を保持するように設計されました。一方、zlib形式( gzcompress
)はインメモリおよび通信チャネルアプリケーション用に設計されており、ヘッダーとトレーラーがはるかにコンパクトで、gzipよりも高速な整合性チェックを使用しています。
解決
これらはすべて使用できます。 3つの間に微妙な違いがあります:
- gzencode() はGZIPファイルを使用します
gzip
コマンドラインツールと同じ形式。このファイル形式には、オプションのメタデータを含むヘッダー、DEFLATE圧縮データ、およびCRC32チェックサムと長さチェックを含むフッターがあります。 - gzcompress() はZLIB形式を使用します。圧縮形式、DEFLATE圧縮データ、およびADLER32チェックサムを含むフッターを識別するためだけに役立つ短いヘッダーがあります。
- gzdeflate() は生のDEFLATEを使用します他の両方の形式の基礎となる独自のアルゴリズム。
3つすべてが内部で同じアルゴリズムを使用します。 gzencode()
は、元のファイル名と他の環境データを含める機能を追加します(文字列を圧縮するだけの場合は使用されません)。 gzencode()
および gzcompress()
はどちらもチェックサムを追加するため、アーカイブの整合性を検証できます。これは、信頼性の低い送信および保存方法よりも有用です。すべてがローカルに保存され、追加のメタデータが必要ない場合は、 gzdeflate()
で十分です。移植性のために、 gzencode()
(GZIP形式)をお勧めします。これは、他のツールの中で gzcompress()
(ZLIB形式)よりもおそらくサポートされるでしょう。
非常に短い文字列を圧縮する場合、非常に短い入力ではオーバーヘッドが出力のかなりの部分を占める可能性があるため、各メソッドのオーバーヘッドが関連します。空の文字列を圧縮することで測定される各メソッドのオーバーヘッドは次のとおりです。
-
gzencode( '')
= 20バイト -
gzcompress( '')
= 8バイト -
gzdeflate( '')
= 2バイト
他のヒント
私はPHPの専門家ではなく、提起された質問に答えることはできませんが、ここでは多くの推測が行われており、ファジー情報が提供されているようです。
DEFLATEは、ZLIB、GZIPなどで使用される圧縮アルゴリズムの名前です。理論的には、GZIPは代替の圧縮アルゴリズムをサポートしていますが、実際には何もありません。
「GZIPアルゴリズム」のようなものはありません。 GZIPはDEFLATEアルゴリズムを使用し、圧縮データの周囲にフレーミングデータを配置します。 GZIPを使用すると、ファイル名、ファイルの時刻、CRC、コメントなどを追加できます。ただし、このメタデータはオプションであり、多くのgzipperはそれを省略します。
ZLIBは似ていますが、異なる、より限定されたメタデータのセット、および特定の2バイトのヘッダーを除きます。
これはIETF RFCのすべて 1950 、 1951 、および 1952 。
「gzipアルゴリズムはDEFLATEよりも圧縮率が高い」と言うには単なるナンセンスです。 gzipアルゴリズムはありません。また、GZIP形式で使用されるアルゴリズムは DEFLATE です。
すべてのメソッドは本質的に同じであり、それらの違いはほとんどヘッダーにあります。個人的にはgzencodeを使用します。これにより、gzipユーティリティへのコマンドライン呼び出しと同等の出力が生成されます。
C ++を使用してPHPでgzip圧縮ファイルを解凍する必要がありました。
PHP gzencode
とそれに対応する gzdecode
は Z_NO_FLUSH
メソッドを使用し、データのブロックの最後でエンコード/デコードを行うことがわかりました。 、 Z_FINISH
を適用します。
Windowsのビットとメモリレベルを変更してgzipのデフレーションとインフレーションを許可する限り、zlib WebサイトにあるCのサンプル/チュートリアルを使用して、gzipされたファイルをPHPから解凍および圧縮できます。
追加:このスレッドのほとんどの人は、どのような「圧縮方法」を知らないようです。