PHP での大きな JSON ファイルの処理
大量の JSON ファイルの処理は、特にサイズが 200M を超える可能性のある大きなファイルを扱う場合には困難になる可能性があります。この問題に対処するには、ファイル全体をメモリにロードしないようにすることが重要です。代わりに、コンテンツ全体をバッファリングせずにオブジェクトを個別に処理するストリーミング アプローチをお勧めします。
1 つの効果的な解決策は、PHP 7 の pcrov/JsonReader などのストリーミング JSON プル パーサーを利用することです。このパーサーは、イベントとは異なるアプローチに従います。ベースのパーサーを使用すると、パーサーのメソッドを呼び出してデータを明示的にリクエストできるようになります。これにより、解析プロセスの柔軟性と制御が向上します。
例 1: オブジェクトをエンティティ全体として読み取る
この例では、JSON ファイルからオブジェクトを完全なものとして抽出する方法を示します。 arrays:
use pcrov\JsonReader\JsonReader; $reader = new JsonReader(); $reader->open("data.json"); $reader->read(); // Outer array. $depth = $reader->depth(); // Check in a moment to break when the array is done. $reader->read(); // Step to the first object. do { print_r($reader->value()); // Do your thing. } while ($reader->next() && $reader->depth() > $depth); // Read each sibling. $reader->close();
例 2: 名前付きの個別の読み取り要素
各オブジェクトから特定の要素を抽出する方法を、この例で示します。
$reader = new pcrov\JsonReader\JsonReader(); $reader->open("data.json"); while ($reader->read()) { $name = $reader->name(); if ($name !== null) { echo "$name: {$reader->value()}\n"; } } $reader->close();
例 3: プロパティを名前でフィルターする
この最後の例では、同じ名前が重複している場合でも、特定の名前でプロパティをフィルターする方法を示します。 object:
$json = <<<JSON [ {"property":"value", "property2":"value2"}, {"foo":"foo", "foo":"bar"}, {"prop":"val"}, {"foo":"baz"}, {"foo":"quux"} ] JSON; $reader = new pcrov\JsonReader\JsonReader(); $reader->json($json); while ($reader->read("foo")) { echo "{$reader->name()}: {$reader->value()}\n"; } $reader->close();
大規模な JSON ファイルを処理するための最適なアプローチは、データの構造と目的の操作によって異なります。ただし、ストリーミング JSON パーサーを活用することで、開発者はメモリの問題が発生することなく、大量の JSON ファイルを効率的に処理できます。
以上がメモリの問題を発生させずに、PHP で大きな JSON ファイルを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。