質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

6261閲覧

レスポンス文字列の圧縮効果について

Clor

総合スコア883

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/03/06 02:29

PHPにおけるレスポンスの圧縮効果について検証しています。
約10,000バイトのJSON文字列(キー以外は英数のランダム生成)を効果的に圧縮する方法を
検討しているのですが、PHP標準の方法を使ったところどれも効果が見られませんでした。
※正確には圧縮は効いているのですが、Base64エンコードすると効果がなくなります。

php

1$base_text = (strlen()10,000を超えるまでランダム生成) 2$obj = [ 3 "abc" => $base_text, 4]; 5 6$json = json_encode($obj, JSON_UNESCAPED_UNICODE); // strlen($json) = 約10,000 7$comped = gzencode($json, 9); // strlen($comped) = 約7,500 8$b64 = base64_encode($comped); // strlen($b64) = 約10,000 strlen($json)を超えるケースもあり。 9 10return $b64; // レスポンス

gzdeflate()
gzcompress()
を利用したケースもほぼ同値でした。

同文字列の出にくいJSON文字列は圧縮レスポンスに向かないのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

約10,000バイトのJSON文字列(キー以外は英数のランダム生成)

データ圧縮というものが本質的に「データに含まれる規則性」を使って行われる以上、ランダムなデータに対して圧縮はほとんど効きません。

実際に流すデータで検証した方がいいでしょう。

投稿2017/03/06 03:00

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

WebサーバーがApacheならmod_deflateでレスポンスをgzipにした方がましだと思います。

https://httpd.apache.org/docs/2.4/ja/mod/mod_deflate.html
https://httpd.apache.org/docs/2.2/ja/mod/mod_deflate.html

※正確には圧縮は効いているのですが、Base64エンコードすると効果がなくなります。

圧縮してもBASE64エンコードすると圧縮後のサイズから約1.3倍になります

(ja.wikipedia.org)BASE64

この変換によって、データ量は4/3(約133%)になる[1]。また、MIMEの基準では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れるとデータ量は約137%となる[2]。

投稿2017/03/06 02:47

編集2017/03/06 03:13
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Clor

2017/03/06 05:02

ありがとうございます。 mod_deflateを設定することで100kBのランダム文字列でも75%まで圧縮が可能になりました。
guest

0

Base64エンコードというのは、非文字データ(バイナリ―データ)を含むデータを変革英数の文字列(メール等で送ることが出来る)に変換するものです。

Base64の64は、6ビットで表現できる64種類の値(0x00 ~ 0x3F)を64種類の文字に割り当てる事に由来しています。
1つの文字(8ビット)で、6ビット分の情報しか送れませんから、Base64でエンコードするとデータサイズは33%ほど増加します。このデータ量の増加が、圧縮の効果を帳消しにしているものと思われます。

圧縮してBase64エンコードした場合と、JSON文字列をそのまま使う場合とを比較して、データ量が少なる方法を選ぶのが現実的ではないでしょうか。

投稿2017/03/06 02:48

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JSON で使える文字列は UTF-8 であることが求められていますから(正確には UTF-8, UTF-16, UTF-32 のいずれかだが、UTF-8 以外は環境によっては非対応)、UTF-8 で表現できないバイナリデータに限り、Base64 エンコードしたほうがいいです。

それはともかく、あとは Y.H さんも書かれていますが、Web サーバの方でレスポンスを圧縮して送信する設定をするのが透過的でよいかと思います。

投稿2017/03/06 02:52

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問