我正在使用XMLReader按元素将巨大的xml文件导入MySQL数据库。Xml包含名为“RECORD”的154772个标记(元素)。
XML示例

<?xml version="1.0" encoding="utf-8"?>
<RECORD><NAME>ДОШКІЛЬНИЙ НАВЧАЛЬНИЙ ЗАКЛАД №1 ЗАГАЛЬНОГО РОЗВИТКУ УЖГОРОДСЬКОЇ МІСЬКОЇ РАДИ ЗАКАРПАТСЬКОЇ ОБЛАСТІ</NAME><SHORT_NAME>ДНЗ №1</SHORT_NAME><EDRPOU>34888585</EDRPOU><ADDRESS>88000, Закарпатська обл., місто Ужгород, ВУЛИЦЯ М.ВОВЧКА, будинок 47,  "А"</ADDRESS><BOSS>НАКОНЕЧНА ОЛЕНА АНАТОЛІЇВНА</BOSS><KVED>85.10 Дошкільна освіта</KVED><STAN>зареєстровано</STAN><FOUNDERS><FOUNDER>УПРАВЛІННЯ ОСВІТИ УЖГОРОДСЬКОЇ МІСЬКОЇ РАДИ, розмір внеску до статутного фонду - 0.00 грн.</FOUNDER>...</FOUNDERS></RECORD>...

用于MySQL连接
function connectBase(){

    include __DIR__ . '/../../settings/sql.set.php';
    $mysql = mysqli_connect($_sqlhost, $_sqluser, $_sqlpass, $_sqldb);
    mysqli_query($mysql, "Set charset utf8");
    mysqli_query($mysql, "Set character_set_client = utf8");
    mysqli_query($mysql, "Set character_set_connection = utf8");
    mysqli_query($mysql, "Set character_set_results = utf8");
    mysqli_query($mysql, "Set collation_connection = utf8_general_ci");
    return $mysql;
}

解析的主要功能
function XMLReaderToDB($setting = false)
{

    $mysql = connectBase();
    $dir = __DIR__ . '/../../tmp/';
    $xmlURL = $dir . $setting['file'];
    $xml = new XMLReader();
    $xml->open($xmlURL);

    $start_time = time();
    $start = $setting['start'];
    $limit = $setting['limit'];
    $stop = $start + $limit;

    $i = 0;
    $count = 0;
    $result = 1;

    while($xml->read())
    {
            if ($xml->nodeType == XMLReader::ELEMENT && $xml->name == $setting['tag']) {

                $item[] = "('items', '" . mysqli_real_escape_string($mysql, $xml->readOuterXML()) . "')";
            }

            if ($xml->nodeType == XMLReader::END_ELEMENT && $xml->name == $setting['tag']) {
                $i++;
                $count++;
                if ($count >= 500) {
                    insertXMLtoDB($mysql, $item);
                    $item = array();
                    $count = 0;
                }
            }
        if($i == $stop){
            break;
        }
    }
    $xml->close();
    insertXMLtoDB($mysql, $item);

    $mysql->close();

    $end_time = time();
    $time_elapsed_secs = $end_time - $start_time;
    echo '<br/>Items: ' . $i . '<br/>';
    echo 'Start: ' . date('H:i:s', $start_time) . '<br/>';
    echo 'End: ' . date('H:i:s', $end_time) . '<br/>';
    echo $time_elapsed_secs . ' sec. (' . ($time_elapsed_secs /60) . ' min.)';
    die;
}

对于MySQL insert
function insertXMLtoDB($mysql, $data = false){
    mysqli_query($mysql,"INSERT INTO _parse_tmp (parse_key, parse_value) VALUES " . implode(", ", $data));
    $data = array();
    // echo 'Success';
}

但是,MySQL请求不会在154772次插入后停止,“while”继续运行。我注意到,如果在insertXMLtoDB函数中取消注释echo'Success';则“while”在154772次插入时停止并正确完成。
我的功能出了什么问题?

最佳答案

不过,我从未亲自使用过XMLReader,我假设您可以尝试在语句中添加另一个条件,比如while($xml->read() && $i != $stop),而不是直接将它放在循环中。Ah还注意到,在使用函数insertXMLtoDB之后,您会重新声明$data,尽管您会注意到每次调用函数时都将其设置为NULL,因此将其设置为数组是毫无意义的。

10-05 20:43
查看更多