近年、モバイルインターネットの急速な発展と、クラウドコンピューティング、モノのインターネット、人工知能などの分野の活発な発展に伴い、データ処理の効率化が大手企業の関心事の一つとなっています。 Web開発においてjsonデータの処理は欠かせないものとなっており、Web開発の主力であるPHPもjsonデータをいかに効率的に処理するかという課題に直面しています。これに関連して、この記事では、PHP で json を配列に変換する効率と、それを最適化する方法について説明します。
PHP では、json データを配列に変換する操作は非常に簡単で、 json_decode() 関数を使用するだけです。この関数の定義は次のとおりです。
mixed json_decode ( string $json [, bool $assoc = FALSE [, int $depth = 512 [, int $options = 0 ]]] )
このうち、$json パラメータはデコードする json 文字列を示し、$assoc パラメータは json オブジェクトを連想配列に変換するかどうかを示し、$ Depth パラメータはサポートされるデコード レイヤの最大数を示し (デフォルトは 512)、$options パラメータはデコード中の動作オプションを示します。
次は簡単な例です:
$json_str = '{"name":"张三","age":18}'; $arr = json_decode($json_str, true); print_r($arr);
出力結果は次のとおりです:
Array ( [name] => 张三 [age] => 18 )
json 文字列を配列に変換するのは非常に簡単であることがわかります。処理効率も比較的高く、連想配列と通常の配列の変換を同時にサポートします。
json から配列への変換は非常に簡単ですが、大量の json データを処理する場合にはパフォーマンスのボトルネックが発生します。まず、JSON 文字列をデコードするには、メモリ、CPU などの特定のシステム リソースが必要です。次に、json 文字列を配列に変換する場合、json 文字列の構造に従って層ごとに解析して変換する必要があり、このプロセスにも多くの時間とリソースが必要です。
この問題を説明するために、次はパフォーマンス テストの例です。テストされた json データには 10,000 個のオブジェクトが含まれており、各オブジェクトには 10 個の属性があり、すべての属性は文字列型です。合計サイズは約 10MB です。
<?php $start_time = microtime(true); $json = file_get_contents('test.json'); $arr = json_decode($json, true); echo count($arr) . " "; echo (microtime(true) - $start_time) . " ";
テスト結果は次のとおりです:
10000 0.785
10MB の json データをデコードして変換するには 0.785 秒かかることがわかります。この時間は、同時実行性が高く実際のアプリケーションで使用される可能性があります。 -時間要件がボトルネックになります。したがって、jsonから配列への変換をいかに効率化するかが非常に重要な課題となっています。
json を配列に変換する際のパフォーマンスのボトルネックに対処するために、さまざまな最適化ソリューションを採用できます。
3.1. json データの圧縮
まず、json データを圧縮して json 文字列のサイズを削減し、それによってデコードと変換の時間を短縮できます。一般的な圧縮方法には、gzip や LZ4 などがあります。たとえば、上記の例で gzip を使用して json データを圧縮すると、データ サイズが約 1.56 MB に削減され、デコードと変換の時間が短縮されます。
3.2. ストリーミング解析メソッドを使用する
2 番目に、ストリーミング解析メソッドを使用して、json データを段階的に解析し、json 文字列全体を一度にメモリにロードすることを回避できます。 php で json_stream_decode() 関数を使用して、ストリーミング解析を実装できます。例:
<?php $handle = fopen('test.json', 'r'); $arr = []; $parser = json_parser(); while (($line = fgets($handle)) !== false) { $result = $parser->write($line); if ($result !== null) { array_push($arr, $result); } } fclose($handle); echo count($arr) . " "; function json_parser() { $parser = new JsonStreamingParser_Parser(new class() implements JsonStreamingParser_Listener { private $current_obj; private $stack; public function start_document() { $this->stack = []; } public function start_object() { $this->current_obj = []; } public function end_object() { $obj = array_pop($this->stack); if (!empty($this->stack)) { $current_key = end($this->stack); $current_key[] = $obj; } else { array_push($this->current_obj, $obj); } } public function start_array() { $this->stack[] = []; } public function end_array() { $arr = array_pop($this->stack); if (!empty($this->stack)) { $current_key = end($this->stack); $current_key[] = $arr; } else { array_push($this->current_obj, $arr); } } public function key($key) { array_push($this->stack, [$key]); } public function value($value) { $current_key = end($this->stack); $current_key[] = $value; } public function whitespace($whitespace) { } }); return $parser; }
この例では、サードパーティ ライブラリ JsonStreamingParser を使用してストリーミング解析を実装します。基本原理は、json データを複数の小さな部分に分解し、それぞれの小さな部分を解析して、対応する配列要素を生成することです。このようにして、json 文字列全体を一度にメモリにロードすることを回避できるため、効率が大幅に向上します。
3.3. バイナリ プロトコルの使用
最後に、バイナリ プロトコルを使用して json 文字列を置き換え、送信および処理用のバイナリ データに変換できます。バイナリ データは通常、リテラル データよりもコンパクトであるため、より高速に解析できます。 php では、MessagePack 拡張機能を使用してバイナリ プロトコル処理を実装できます。例:
$msgpack = new MessagePack(); $packed = $msgpack->pack($arr); $unpacked = $msgpack->unpack($packed);
この例では、配列はバイナリ形式に変換され、相互変換には MessagePack クラスの Pack() メソッドと unpack() メソッドが使用されます。バイナリ プロトコルを使用すると、デコードと変換の効率が大幅に向上することがわかります。
実際の開発において、json は非常によく使われるデータ形式であり、Web API の標準データ形式の 1 つでもあります。したがって、php で json を配列に変換する効率を最適化することが非常に重要です。この記事では、圧縮アルゴリズムの使用、ストリーミング解析の使用、バイナリ プロトコルの使用を含む 3 つの一般的な最適化ソリューションを紹介します。各最適化ソリューションには独自の利点と適用可能なシナリオがあり、開発者は実際のニーズに基づいて適切なソリューションを選択できます。
以上がphp jsonから配列への変換効率の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。