ホームページ >バックエンド開発 >PHPチュートリアル >PHP の XML 読み取りが非常に遅い (大量のデータ)
PHP を使用して、関数 getxmldata() 関数を使用して、マーチャントの製品 API を XML 形式で読み取りますが、データが大きすぎるため、実行時間が頻繁にタイムアウトになります。このような大きな XML を読み取る良い方法はありますか?部分ごとに読む方法はありますか?具体的には、残ったポイントはすべて付与されます。よろしくお願いします〜
タオバオのAPIの読み込みがタイムアウトしないのですが、データ量はどれくらいですか...
また、それは確かにデータ量が多いためです。それは間違いなくタイムアウトするので、 set_time_limit() を使用してタイムアウトをリセットします
タオバオの API の読み取りはタイムアウトしません。データ量が多すぎるため、確実にタイムアウトします。次に、set_time_limit() を使用してタイムアウトを設定します。そうしないと、効率が非常に低くなります。読書効率は?
getxmldata() 関数の書き方がわかりません
PHP には XML を操作するための SimpleXML と DOMDocument が用意されています。それを使用しないのはなぜですか?
getxmldata() 関数の書き方がわかりません
PHP は SimpleXML を提供しますXMLを操作できるDOMDocumentがあるので、ちょっと使ってみてはいかがでしょうか?
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~~