0

ここに適切なソリューションがまったくないことは、私を夢中にさせています。

サイズが 14 MB の XML ファイルが顧客から提供されましたが、今後のリクエストではさらに大きくなる可能性があります。データを MySQL テーブルに定期的にロードできるスクリプトが必要です。サーバーは MySQL 5.0.96 を実行しているため、LOAD XML コマンドを使用できるとは思えません。

PHP DOM ライブラリを使用して XML ファイルを解析しようとしましたが、Apache が 500 内部サーバー エラーを返します。XML ファイルをロードする PHP コードをコメントアウトすることができ、スクリプトは (データなしで) スムーズに実行されるため、これはメモリ不足であると考えられます。サーバーのメモリ制限はすでに 128MB です。

XMLReader も試してみましたが、同じことをしているようです。助言がありますか?

4

1 に答える 1

0

XMLReaderはイテレータとして機能するため、xmlドキュメントの個々のトークンに関してグループ化/抽出ロジックを実装する必要があります。<row>単一の挿入に対応するxmlファイルのような要素があるとすると、次のようになります。

$reader = new XMLReader();
$reader->open('/path/to/the/file.xml');
while ($reader->read()) {
    if ($reader->name == "row" && $reader->nodeType == XMLReader::ELEMENT) {
        // the cursor currently at <row> element

        // hopefully one fragment will fit into memory and you can use simplexml for easy access
        // alternatively try $reader->expand() for DOMNode of the same thing
        $rowxml = simplexml_load_string('<'.'?xml version='1.0'?'.'>'.$reader->readOuterXML());

        // build insert from the $rowxml object, run the query
    }
}
$reader->close();
于 2012-11-21T20:10:24.760 に答える