1. ホーム
  2. php

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

2023-11-04 12:22:02

質問

私は、2つのPHPスクリプトを使用して移動する大量のデータを持っています。1つはコマンドラインPHPスクリプトを使用してクライアント側で、もう1つはApacheの後ろで使用します。私はデータをサーバー側に POST し、php://input stream を使用して Web サーバー側で保存します。メモリの制限に達しないように、データはPOSTリクエストごとに500kBのチャンクに分けられています。これらはすべて問題なく動作しています。

さて、帯域幅を節約してスピードアップするために、私は送信前にデータを圧縮し、相手側で受信したときに解凍したいと思います。その仕事をすることができる3組の関数を見つけましたが、どれを使うか決めかねています。

どの機能のペアがお勧めですか、またその理由は?

UPDATEです。 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バイト