web-dev-qa-db-ja.com

PHPで使用する圧縮方法は?

2つのPHPスクリプト:クライアント側でコマンドラインを使用する1つPHPスクリプトとその他のApacheの背後にあるスクリプトを使用しています。 POSTデータをサーバー側に送信し、php:// inputストリームを使用してWebサーバー側に保存します。メモリ制限に達しないように、データはそれぞれ500kBのチャンクに分割されます= POST request。これはすべてうまくいきます。

ここで、帯域幅を節約してスピードを上げるために、送信前にデータを圧縮し、反対側で受信時に解凍します。私は仕事をすることができる3つの機能のペアを見つけました、しかし私はどちらを使うべきか決めることができません:

どの機能のペアを推奨しますか、またその理由は何ですか?

UPDATE:私はzlib FAQを読みました:

gzip形式(gzencode)は、名前や最終更新日など、1つのファイルに関するディレクトリ情報を保持するように設計されています。一方、zlib形式(gzcompress)は、インメモリおよび通信チャネルアプリケーション用に設計されており、ヘッダーとトレーラーがはるかにコンパクトで、gzipよりも高速な整合性チェックを使用します。

61
Milan Babuškov

これらはすべて使用できます。 3つの間に微妙な違いがあります。

  • gzencode() は、gzipコマンドラインツールと同じGZIPファイル形式を使用します。このファイル形式には、オプションのメタデータを含むヘッダー、DEFLATE圧縮データ、およびCRC32チェックサムと長さチェックを含むフッターがあります。
  • gzcompress() は、ZLIB形式を使用します。圧縮形式、DEFLATE圧縮データ、およびADLER32チェックサムを含むフッターを識別するためにのみ機能する短いヘッダーがあります。
  • gzdeflate() は、そのままのDEFLATEアルゴリズムを使用します。これは、他の両方の形式の基礎となります。

3つとも、内部では同じアルゴリズムを使用します。 gzencode()は、元のファイル名と他の環境データを含める機能を追加します(これは文字列を圧縮するだけでは使用されません)。 gzencode()gzcompress()はどちらもチェックサムを追加するので、アーカイブの整合性を検証できます。これは、信頼性の低い転送方法や保存方法では役立ちます。すべてがローカルに保存されていて、追加のメタデータが必要ない場合は、gzdeflate()で十分です。移植性のために、他のツールの中でおそらくgzencode()(ZLIB形式)よりもサポートされているgzcompress()(GZIP形式)をお勧めします。

非常に短い文字列を圧縮する場合、入力が非常に短いとオーバーヘッドが出力のかなりの部分を占める可能性があるため、各メソッドのオーバーヘッドが関係します。空の文字列を圧縮して測定される各メソッドのオーバーヘッドは、次のとおりです。

  • gzencode('') = 20バイト
  • gzcompress('') = 8バイト
  • gzdeflate('') = 2バイト
80
thomasrutter

私はPHP=エキスパートではないので、出された質問に答えることはできませんが、ここでは多くの推測があり、あいまいな情報が提供されているようです。

DEFLATEは、ZLIB、GZIPなどで使用される圧縮アルゴリズムの名前です。理論的には、GZIPは代替の圧縮アルゴリズムをサポートしていますが、実際にはありません。

「GZIPアルゴリズム」というものはありません。 GZIPはDEFLATEアルゴリズムを使用し、圧縮データの周囲にフレーミングデータを配置します。 GZIPを使用すると、ファイル名、ファイルの時刻、CRC、さらにはコメントなどを追加できます。ただし、このメタデータはオプションであり、多くのgzipperでは省略されています。

ZLIBは似ていますが、メタデータのセットが異なり、より限定的であり、特定の2バイトのヘッダーがある点が異なります。

これはすべてIETF RFC 1951951 、および 1952 に含まれています。

「gzipアルゴリズムはDEFLATEよりも圧縮率が高い」と言っても意味がありません。 gzipアルゴリズムはありません。また、GZIP形式で使用されるアルゴリズムはDEFLATEです。

43
Cheeso

すべてのメソッドは基本的に同じですが、それらの違いは主にヘッダーにあります。個人的にはgzencodeを使用します。これにより、gzipユーティリティへのコマンドライン呼び出しと同じ出力が生成されます。

6
Jan Jungnickel

PHP C++でgzip圧縮ファイルを解凍する必要がありました。PHP gzencodeとそれに対応するgzdecodeZ_NO_FLUSHメソッドを使用し、エンコード/デコードするデータのブロックの最後にZ_FINISHを適用します。zlibWebサイトに示されているCの例/チュートリアルを使用して、解凍および圧縮できます。 Windowsのビットとメモリレベルが変更され、gzipのデフレーションとインフレーションが許可される限り、PHPからgzipで圧縮されたファイル。

補足:このスレッドのほとんどの人は、「圧縮方法」が何を意味するのか分からないようです。

0
AKJ