7

問題:

  • 配列を短い文字列にシリアル化する必要があります。短いほど良いです。
  • 重要性は、小さいアレイよりも大きいアレイに反映されます。
  • 文字列は get リクエストで使用されるため、URL をデコードする必要があります。

現在のコード スニペット

  /* 
    array (size=3)
      0 => string '/js/dhdbm78hdfb.js' (length=18)
      1 => string '/js/dfg4dg.js' (length=13)
      2 => string '/js/fg8hfhrt.js' (length=15)
      2 => string '/js/yjtdygj.js' (length=14)
      2 => string '/js/2q5g54rvfd.js' (length=17)
   */

  $json = json_encode($data);
  $gz = gzdeflate($json, 9);
  $base64 = base64_encode($gz);
  $paths = urlencode($base64);

  // outputs: i1aK0c8qjtFPyUhJyjW3yEhJS9LLKlbSgQmnpZukpCOLpKVbZKRlFJUgi1VmlaRUpmchCxkVmqabmhSVpaWARGMB

あまり印象的ではなく、かなり遅いですが、これを行うためのより良い方法があるはずです...

質問

この問題に対する最善のアプローチは何でしょうか? 可能な限り最小の文字列をどのように提示できますか?

PS

遅い場合は最大の問題ではありませんが、考慮すべき変数です。可能な場合、配列はハッシュされ、キャッシュから取得されます。

4

3 に答える 3

2

できるだけ高速で小さくしたい場合は、汎用ツールを捨てて、送信する特定のデータに適した方法を使用してください。すべての配列値 (「/js/」と「.js」など) の間で重複するものを取り除き、シリアル化からすべての配列構文を取り除き、一意の値の文字列連結リストを送信し、それを再構成します受け取り側。

必要に応じて gz と base64_encode でさらに圧縮しますが、一意のデータを持つことの欠点の 1 つは、一意に表現する必要があることです。

ここで選択した回答を参照してください: How to compress/decompress a long query string in PHP?


編集:代わりにデータを POST する余裕はありますか? これにより、少なくともクエリ文字列に関連する直接的なサイズ制限が回避されます。また、URL の文字列をエンコードして長さを追加する必要がなくなり、ほとんどの節約のために、圧縮されたコンテンツを直接送信できるはずです。

于 2013-03-27T18:44:55.430 に答える
1
serialization = json_encode
compression = gzdeflate
urlsafe = base64_encode

urlencodebase64_encode安全な文字のみを生成するため、必要ありません。私はbase64_encodeそこに保管します。より高速なシリアライザーまたは高速なコンプレッサーを見つけることを検討できます。入力が十分に短い場合は、コンプレッサーを省略することもできます。


アルゴリズムには、命令数とメモリ使用量という 2 つの次元のパフォーマンス特性があります。通常、一方を減らそうとすると、もう一方が上がることがわかります。データベース内のインデックスは高速検索を可能にしますが、多くのスペースを占有します。インデックスなしの検索は低速ですが、インデックス用の余分なスペースは必要ありません。

短くしたいということは、 fastに関して犠牲にする必要があることを意味します。


正直なところ、ここにはかなり最適なセットがあると思います。

于 2013-03-27T18:23:44.190 に答える
-1

gzcompress()関数を使ってみる

http://php.net/manual/en/function.gzcompress.php

于 2013-03-27T18:22:14.300 に答える