web-dev-qa-db-ja.com

PHPでシリアル化またはjson?

したがって、配列をPHPでエンコードし、MySQLデータベースにプレーンテキストで保存する必要があります。私の質問はserialize()またはjson_encode()を使用すべきですか?それぞれの長所と短所は何ですか?そのうちの?

私は彼らのどちらかがこの状況で行うと思います。しかし、あなたはどちらを好むでしょうか?その理由は?配列以外のもの用の場合は?

45
datasn.io

serializeの主な利点:PHPに固有です。つまり、は、PHP types)を表すことができ、独自のクラスのインスタンスを含む-そして、データを非シリアル化するときに、オブジェクトを戻しますが、クラスのインスタンスを戻します。


json_encodeの主な利点:JSONはPHPに固有ではありません:複数の言語で読み書きできるライブラリがあります。 PHP以外の言語で操作できるもの。

JSON文字列は、シリアル化された文字列よりも読み取り/書き込み/変更が簡単ですby hand

一方、JSONはPHPに固有のものではないため、PHP-データ型のようなものに固有のものを認識していません。


補足説明として:

  • これら2つの間に速度のわずかな違いがあったとしても、それほど重要ではありません。おそらく、大量のデータをシリアル化/非シリアル化しないでしょう。
  • これがデータベースにデータを保存する最良の方法であると確信していますか?
    • DBでは、シリアル化されたストリンに対して多くのクエリを実行できません。データをwhere句で使用したり、PHPの介入なしに更新したりすることはできません...
49
Pascal MARTIN

PHPでのJson Encoding vs Serializationの分析を行いました。そして、Jsonは配列のような単純で単純なデータに最適であることがわかりました。

https://www.shozab.com/php-serialization-vs-json-encoding-for-an-array/ で私の実験の結果を参照してください

11
Shozab Hasan

json_encodeserializeに対するもう1つの利点は、サイズです。 memcacheが使用するメモリが非常に大きくなる理由を見つけようとしていたので、削減する方法を見つけようとしていました。

<?php

$myarray = array();
$myarray["a"]="b";
$serialize=serialize($myarray);
$json=json_encode($myarray);
$serialize_size=strlen($serialize);
$json_size=strlen($json);
var_dump($serialize);
var_dump($json);
echo "Size of serialized array: $serialize_size\n";
echo "Size of json encoded array: $json_size\n";
echo "Serialize is " . round(($serialize_size-$json_size)/$serialize_size*100) . "% bigger\n";

それはあなたに与えます:

string(22) "a:1:{s:1:"a";s:1:"b";}"
string(9) "{"a":"b"}"
Size of serialized array: 22
Size of json encoded array: 9
Serialize is 59% bigger

明らかに、最も極端な例を取り上げました。配列が短いほど、シリアル化のオーバーヘッドがより重要になります(コンテンツがどれだけ小さくても最小文字数を課す書式設定により、初期オブジェクトサイズに比べて)。それでも実稼働Webサイトからは、jsonの同等のものより20%大きいシリアル化されたアレイが表示されます。

6
Max

まず、配列またはオブジェクトをシリアル化してデータベースに保存するのは、通常コードのにおいです。場合によっては、列にコンマ区切りのリストを入れて、後でクエリを実行する必要があるとわかったときにあらゆる種類のトラブルに巻き込まれることがあります。

このような状況にある場合は、そのことについて非常に慎重に考えてください。

違いについては。 PHP serializeはおそらくよりコンパクトですが、PHPでのみ使用できます。JSONはクロスプラットフォームであり、エンコードとデコードが遅くなる可能性があります(意味があるとは思えませんが)。

5
cletus

まず、これらのテストをしてくれたShozab Hasanとuser359650に感謝します。私はどちらの選択肢が最良だったのか疑問に思っていましたが、今私は知っています:

単純な配列、PHP AND javascript、多分他の言語)の両方でOKであるJSONをエンコードします。

PHPオブジェクトをエンコードするには、PHP PHPでのみインスタンス化できるオブジェクト。

データを保存するには、エンコードされたデータをファイルに保存するか、標準形式のMySQLを使用します。データを取り戻す方がはるかに簡単です。 MySQLには、PHP処理なしでデータを取得したい方法でデータを取得する優れた機能があります。

テストを行ったことはありませんが、システムファイルの並べ替えでファイルをアルファベット順/数字順に戻すのに十分であれば、ファイルストレージがデータを保存する最良の方法だと思います。 MySQLはこの種の処理に貪欲で、ファイルシステムも使用します...

3
Vidda

データがPHPアプリケーションを離れる必要がない場合、serialize()をお勧めします。これは、オブジェクトに対して__sleep()や__wakeup()メソッドなどの追加機能を多数提供するためです。正しいクラスのインスタンスとしてのオブジェクト。

シリアル化されたデータを別のアプリケーションに渡す場合、互換性のためにJSONまたはXMLを使用する必要があります。

しかし、シリアル化されたオブジェクトをデータベースに保存しますか?多分あなたはそれについてもう一度考える必要があります。後で実際のトラブルになる可能性があります。

2
selfawaresoup