ホームページ >バックエンド開発 >PHPチュートリアル >PHP の XML 読み取りが非常に遅い (大量のデータ)

PHP の XML 読み取りが非常に遅い (大量のデータ)

WBOY
WBOYオリジナル
2016-06-23 14:17:481107ブラウズ

PHP を使用して、関数 getxmldata() 関数を使用して、マーチャントの製品 API を XML 形式で読み取りますが、データが大きすぎるため、実行時間が頻繁にタイムアウトになります。このような大きな XML を読み取る良い方法はありますか?部分ごとに読む方法はありますか?具体的には、残ったポイントはすべて付与されます。よろしくお願いします〜


ディスカッションへの返信(解決策)

タオバオのAPIの読み込みがタイムアウトしないのですが、データ量はどれくらいですか...

また、それは確かにデータ量が多いためです。それは間違いなくタイムアウトするので、 set_time_limit() を使用してタイムアウトをリセットします

タオバオの API の読み取りはタイムアウトしません。データ量が多すぎるため、確実にタイムアウトします。次に、set_time_limit() を使用してタイムアウトを設定します。そうしないと、効率が非常に低くなります。読書効率は?

getxmldata() 関数の書き方がわかりません

PHP には XML を操作するための SimpleXML と DOMDocument が用意されています。それを使用しないのはなぜですか?

特別なのは XML 構文解析関数で、XML をストリーミング形式で解析できるため、独自の解析プログラムを作成するのに適しています



getxmldata() 関数の書き方がわかりません

PHP は SimpleXML を提供しますXMLを操作できるDOMDocumentがあるので、ちょっと使ってみてはいかがでしょうか?

特別なのは、XML をストリーミング形式で解析できる XML 構文解析関数です。これは、独自の解析プログラムを作成するのに適しています


getxmldata 関数は、simpleXML を使用しますが、xml が大きいため、時間がかかります。読むこと。たとえば、サイズが50Mのxmlファイルの場合、毎回5Mをメモリに読み込んで(つまり、毎回小さな部分を読み込んで)処理し、次にxmlからさらに5Mを読み取るような方法はありますか?これにより速度は向上しますか、それとももっと良い方法はありますか?

さて、SimpleXML と DOMDocument は両方とも一度に xml をメモリにロードします
ファイルが大きい場合は、XML 構文解析関数の使用を検討できます
たとえば、マニュアルのサンプル

$file = "data.xml";$depth = array();function startElement($parser, $name, $attrs){    global $depth;    for ($i = 0; $i < $depth[$parser]; $i++) {        echo "  ";    }    echo "$name\n";    $depth[$parser]++;}function endElement($parser, $name){    global $depth;    $depth[$parser]--;}$xml_parser = xml_parser_create();xml_set_element_handler($xml_parser, "startElement", "endElement");if (!($fp = fopen($file, "r"))) {    die("could not open XML input");}while ($data = fread($fp, 4096)) {    if (!xml_parse($xml_parser, $data, feof($fp))) {        die(sprintf("XML error: %s at line %d",                    xml_error_string(xml_get_error_code($xml_parser)),                    xml_get_current_line_number($xml_parser)));    }}xml_parser_free($xml_parser);

さて、SimpleXML と DOMDocument は両方ともロードしますxml を一度にメモリに保存します
ファイルが大きい場合は、XML 構文解析機能の使用を検討できます
たとえば、マニュアルの

$file = "data.xml";$depth = array();function startElement($parser, $name, $attrs){    global $depth;    for ($i = 0; $i < $depth[$parser]; $i++) {        echo "  ";    }    echo "$name\n";    $depth[$parser]++;}function endElement($parser, $name){    global $depth;    $depth[$parser]--;}$xml_parser = xml_parser_create();xml_set_element_handler($xml_parser, "startElement", "endElement");if (!($fp = fopen($file, "r"))) {    die("could not open XML input");}while ($data = fread($fp, 4096)) {    if (!xml_parse($xml_parser, $data, feof($fp))) {        die(sprintf("XML error: %s at line %d",                    xml_error_string(xml_get_error_code($xml_parser)),                    xml_get_current_line_number($xml_parser)));    }}xml_parser_free($xml_parser);
の例

ありがとう、Bamboo~~

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。