PHPの4つのシリアル化スキーム

オリジナル住所: HTTPS://t.ti-node.com/thread / …

データのシリアライズは非常に便利な機能ですが、多くの人が私と似ています。最初にこの物に触れたとき、商品が乾燥している理由を理解できませんでした。その後、

「私の指導者、私の連隊」、全国軍の双方向人身売買業者と二人の俳優Xiaolongのクラスメートの画像提供)。

実際、データをシリアライズする役割は、2つ以上に過ぎません。

  • 便利な伝送
  • 便利なストレージ

どのようにそれを格納する方法を理解するには? たとえば、データベースやファイルに保存する必要のあるPHPオブジェクトやPHP配列がある場合は、これは不可能ですが、現時点では、PHPオブジェクトまたはPHP配列を保存操作の前にシリアル化する必要があります。 しかし、これはPHP配列をシリアライズして保存することで理解できます。このオブジェクトを保存することはできますか? この操作はあまりにも傲慢ですか? 青年、これは大きな問題ではありません。 オブジェクトは直接格納されることもあり、単純なデシリアライズの後にのみ、新しいオブジェクトによってもたらされるエネルギー消費の手間を避けるために、オブジェクトを実動させることができます。

どのように転送を理解するには? 実際、シリアル化は伝送アプリケーションでは比較的一般的です。 最も簡単な例は、ajaxがTAを使用するためのAPIを見つけるためのコードフロントエンドコードです.jsonやxmlなどの返すデータをネゴシエートする必要があります。どちらもプライベートデータフォーマットに同意する必要があります。 たとえば、典型的なサービスアーキテクチャでは、ゲートウェイサーバーと内部RPCサーバーはmsgpackを通じてデータを渡します。 これは、伝送のためのシリアライゼーションの典型的なアプリケーションケースです。

ここでのシリアライズの概念は、従来のシリアライズ、json、msgpack、protobufなどを含む、より広範かつ一般的なものです。 (シリアライゼーションが非常に厳密ではないと思う場合は、代わりにエンコードを使用できますが、デシリアライゼーションはデコードに置き換えられますが、とにかく、シリアライズとデシリアライゼーションを使用して、それを参照してください。あなたはネットワークケーブルに沿って私を切断することができます!)。

実際、上位レベルでは、データのシリアライズは2つのタイプに分けることができます。

  • テキストシリアライゼーション、json、serialize、xmlなどの共通
  • バイナリシリアル化(msgpack、protobuf、thriftなど)

一般的に言えば、シリアライズ・テクノロジには2つのパフォーマンス・インジケータがあります.1つはシリアライズ・スピード、もう1つはシリアライズ・データのサイズです。 現時点では、protobufやmsgpackなどのバイナリシリアル化は、速度とデータサイズの両方でテキストシリアライズより優れています。 しかし、やはり、テキストのシリアライゼーションは読みやすくなります。データを一目で把握するのはおそらく冗談でしょう。

今日、4つのプログラムがあります。これらの4つのプログラムは、シンプルで無礼で、すぐに使えるものであり、感情をテストし、どちらがより適切かを確認します。

会議に参加した4人の仲間:PHP組み込みシリアル化、PHP組み込みJSONパーサ、PHP拡張JSOND、PHP拡張モジュール、msgpack。 最初の3つはテキストタイプで、msgpackはバイナリです。

:、人々が商品をインストールする必要があることを、拡張機能として、より迅速に内蔵された牛のXの数よりもビルトインJSONパーサー高度なバージョンPHPなどJSOND噂されている、アドレス来るhttps://pecl.php.net/get/は、 … JSON

msgpackは、バイナリシリアル化のツールに従事している弟の鳥、で、スローガンは「それはJSON.butのように高速で小型だである。」、 :住所来ます。https://pecl.php.net/get/msgpは…

  1. シリアル化の使用
    Serialize()、シリアライズメソッド。
    Unserialize()、デシリアライズメソッド。
  2. Jsonの使用法
    Json_encode()、何も言いませんか?
    Json_decode()、何も言いませんか?
  3. Jsondの使い方
    Json_encode()のように、json_encode()の後に複数の文字dが続きます。
    json_decode()のように、json_decode()の後に複数の文字dが続きます。
  4. Msgpackの使用法
    Msgpack_pack()、直列化メソッド。
    Msgpack_unpack()、デシリアライズメソッド。

テストコードは次のとおりです。

<?php
// 故意搞了一个还算大的php数组,更容易看出差距来
$arr = array(
  array(
    'uid' => 22193123,
    'gender' => 'famale',
    'username' => 'elarity',
    'password' => md5('www123'),
    'relation' => array(
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
      array(
        'uid' => 22193123,
        'gender' => 'famale',
        'username' => 'elarity',
        'password' => md5('www123'),
      ),
    ),
  )
);

// 每种序列化方案都执行100000次
$counter = 100000;

// json序列化方案,执行100000次
echo PHP_EOL.PHP_EOL;
$start = microtime( true );
for( $i = 1; $i <= $counter; $i++ ){
  $json = json_encode( $arr ); 
}
$size = strlen( $json );
$end = microtime( true );
$cost_time = $end - $start;
echo "json_encode : 耗费时间为{$cost_time} , 数据体积为{$size}".PHP_EOL;

// jsond序列化方案,执行100000次
$start = microtime( true );
for( $i = 1; $i <= $counter; $i++ ){
  $jsond = jsond_encode( $arr ); 
}
$size = strlen( $jsond );
$end = microtime( true );
$cost_time = $end - $start;
echo "jsond_encode : 耗费时间为{$cost_time} , 数据体积为{$size}".PHP_EOL;

// serialize序列化方案,执行100000次
$start = microtime( true );
for( $i = 1; $i <= $counter; $i++ ){
  $serialize = serialize( $arr ); 
}
$size = strlen( $serialize );
$end = microtime( true );
$cost_time = $end - $start;
echo "serialize : 耗费时间为{$cost_time} , 数据体积为{$size}".PHP_EOL;

// msgpack序列化方案,执行100000次
$start = microtime( true );
for( $i = 1; $i <= $counter; $i++ ){
  $msgpack = msgpack_pack( $arr );
}
$size = strlen( $msgpack );
$end = microtime( true );
$cost_time = $end - $start;
echo "msgpack耗费时间为 : {$cost_time} , 数据体积为{$size}".PHP_EOL;
echo PHP_EOL.PHP_EOL;

ファイルをtest.phpとして保存し、次にphp test.phpを保存します。結果は次のようになります。

要約すると:

  1. Jsonは実際にjsonよりも高速です
  2. 彼らの口を開いて、jsonよりも速くserialize()する人が常にいます。
  3. serialize()データボリュームは本当に大きい(データ型の説明も保持されているため)
  4. msgpackベストとは何ですか? ? ? わからない、あなたはそれを自分で感じる。

元のリンク