web-dev-qa-db-ja.com

WordPressがjson_encodeよりもデータのシリアル化を選択するのはなぜですか?

私がWordPressを使っていた頃、私はWordPress自体とそのフレンドリーなプラグインがデータをdbに格納するのにPHP serialize()を使っているのを見ました。しかし、最近の検索で、私はjson_encode()に対するserialize()の深刻なコミュニティサポートを見つけました。

そして私は個人的に両方を使って連想配列をテストしました。

  • serialize()ストア342文字
  • json_encode()ストア285文字

なぜ私はこれを求めているのですか?

私はプロジェクトに参加していますが、繰り返しメタフィールドを投稿に格納する予定です。どこで:

  • データは基本的に英語ですが、時にはベンガル語になることもあります。
  • データは3レベルの深さの連想配列になります( levels 正しく理解できればいいです):
array(
    1 => array(
        'key'=>'value',
        'key2'=>'value'
    ),
    2 => array(
        'key'=>'value',
        'key2'=>'value'
    )
)

私はpostmetaテーブルのmeta_valueフィールドがlongtextであることを確認しました、 これはつまり 4,294,967,295文字(4GB)の長さです。

だから私は物事を保存するための堅牢なソリューションが必要です。

13
Mayeenul Islam

これがWP開発者がこのアプローチをとった本当の理由であることを100%確信することはできませんが、常識的に言うと、シリアライズは変数型を保持し、エラー検出にはミニを内蔵し、jsonストアのみ文字列値は{ key : value }なので、PHPに戻るときには、フォーマットを推測するか、それにパーサーを設定する必要があります。これはあなたのデータを扱うための2つの異なる方法を持つことを強いるでしょう:以前はjsonとしてデータを保存することと、jsonをデコードした後それは全く異なるオブジェクトとして戻ってくることです。

これが、サイズの違いPHPが配列だけでなく格納されている主な理由です。シリアル化されたときに配列に含まれていた要素の数、それらの型、およびそれらの値を格納しています。

データベースにキーと値のペアだけを格納するのではなく、さまざまな変数型を持つオブジェクトを格納することもできます。

13
Ramy Deeb

JSONエンコーディングはPHP 5.2で導入されました、WordPressはそれよりもずっと古く、そしてそれはPHP 4から生まれました(そしてそのために設計されました)。

データのシリアル化はWordPressで広く行きわたっているので、PHPシリアル化からJSONエンコーディングへの移行は大きな後方互換性の問題を意味するでしょう、そして私が少しWordPressを知っていれば、それは起こりません。

そうは言っても、JSONエンコーディングがPHPシリアライゼーションよりもあなたに適していると思うなら、それを使ってください。

あなたがメタ関数を投稿するために文字列(つまり、あなたのデータのJSONエンコードバージョン)を渡した場合、WordPressはそれに触れませんが、検索時にデータをJSONデコードすることを忘れないでください。

DBストレージのサイズがあなたにとって非常に重要であるならば、それはおそらく追加の仕事の価値があるということです、さもなければWordPressにそれが使うものを使わせてそれを気にしないでください。

たぶん、あなたはそれがあなたのデータを保存するためのカスタムテーブルの場合であるかどうかを評価することができます。

6
gmazzap

私はこれを「意見の対象」として閉じたいと思っていますが、この質問には良い答えがいくつかあると思います。私は「歴史」と共に行きます。

1)json_encodeはPHPコアで比較的新しいです。

json_encode

(PHP 5> = 5.2.0、PECL json> = 1.2.0)json_encode - 値のJSON表現を返す

http://php.net/manual/en/function.json-encode.php

json_encodeはWordPressの初期の頃は信頼できなかったでしょう。それは5.2で "core" PHPにロールインされただけでした、それはそれよりずっと前にPECL拡張として利用可能でした。

次に、WP_Queryオブジェクトなどのオブジェクトをjson_encodeに入力すると、json_decodestdClassオブジェクトが返されます。 serialize/unserializeはオブジェクトを保存します。

3
s_ha_dum