Maison >développement back-end >tutoriel php >php读xml巨慢(大数据量)

php读xml巨慢(大数据量)

WBOY
WBOYoriginal
2016-06-23 14:17:481109parcourir

我用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);


谢谢斑竹~~

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn