Home >Backend Development >PHP Tutorial >php读xml巨慢(大数据量)
我用php读取商家的商品API,xml格式的,用的函数式getxmldata()这个函数,但是由于数据太大,运行时间常常超时。有没有什么好的办法读这种大的xml?有没有一部分一部分读的方法?具体一点,剩的分都给了。先谢谢大仙们了~
读淘宝的api都没超时 你这个数据量有多大啊...
另外的确是因为数据量大到肯定要超时 那就用set_time_limit() 重新设定个超时时间呗.
读淘宝的api都没超时 你这个数据量有多大啊...
另外的确是因为数据量大到肯定要超时 那就用set_time_limit() 重新设定个超时时间呗.
现在需要把运行时间降下来,否则效率太低了,有没有提高读取效率的方法?
不知道getxmldata()这个函数是如何写的
php提供有操作 XML 的 SimpleXML、DOMDocument ,为何不用一下呢?
特别的是 XML 语法解析函数,可以以流方式分析 XML,比较适合自己书写解析程序
不知道getxmldata()这个函数是如何写的
php提供有操作 XML 的 SimpleXML、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);