@Teraxis

Почему while в php так себя ведет?

Имеется вот така функция php, которая обрабатывает огромный xml (1,5 Гб, 1,5 млн. записей в дочерними тегами).
Пример xml
<?xml version="1.0" encoding="utf-8"?>
<DATA FORMAT_VERSION="1.0">
<RECORD><NAME>ТОВАРИСТВО З ОБМЕЖЕНОЮ ВІДПОВІДАЛЬНІСТЮ ВИРОБНИЧО-ТОРГОВА ФІРМА ШАРМ</NAME><SHORT_NAME>ТОВ &quot;ВТФ &quot;ШАРМ&quot;</SHORT_NAME><EDRPOU>00308749</EDRPOU><ADDRESS>93113, Луганська обл., місто Лисичанськ, ПРОСПЕКТ ЛЕНІНА, будинок 159</ADDRESS><BOSS>ОЛІЙНИК ТЕТЯНА САВЕЛІЇВНА</BOSS><KVED>14.13 Виробництво іншого верхнього одягу</KVED><STAN>зареєстровано</STAN><FOUNDERS><FOUNDER>БАТУРКІНА ІРИНА МИХАЙЛІВНА, розмір внеску до статутного фонду - 3000.00 грн.</FOUNDER><FOUNDER>РЕВА ВАЛЕНТИНА ІВАНІВНА, розмір внеску до статутного фонду - 3000.00 грн.</FOUNDER><FOUNDER>ПЕТРЕНКО КЛАВДІЯ СЕРГІЇВНА, розмір внеску до статутного фонду - 3000.00 грн.</FOUNDER></FOUNDERS></RECORD>
</DATA>


Обработчик xml
function updateFirmsXML()
    {
        $mysql = connectBase();
        $dir = __DIR__ . '/../../tmp/';
        $xmlURL = $dir . '15.1-EX_XML_EDR_UO.xml';
        $xml = new XMLReader();
        $xml->open($xmlURL);

        $start_time = time();
        header('Content-Type: text/html; charset=utf-8');

        $count = 0;
        $count2 = 0;
        while($xml->read())
        {

            if($xml->nodeType == XMLReader::ELEMENT && $xml->name == 'RECORD')
            {
                $item[] = "('firms', '" . mysqli_real_escape_string($mysql, $xml->readOuterXML()) . "')";
            }

            if($xml->nodeType == XMLReader::END_ELEMENT && $xml->name == 'RECORD')
            {
                $count++;
                $count2++;
                if ($count >= 500) {
                    saveXMLtoDB($item);
                    $item = array();
                    $count = 0;
                }
            }
        }

        $xml->close();
        echo saveXMLtoDB($item);
        die;
	}


Функция добавления в базу
function saveXMLtoDB($item = false){
        $mysql = connectBase();
        $sql = "INSERT INTO _parse_tmp (parse_key, parse_value) VALUES " . implode(", ", $item);
        mysqli_query($mysql, $sql);
        echo 'Success';
    }


Всего в базе 1 547 772 записей RECORD. Если с функции saveXMLtoDB убрать echo 'Success' в базу добавляеться более 9 млн. записей. С echo 'Success' все работает нормально. Если ограничить добавление только первых, примером, 1000 записей, то также все работает нормально.
Кто подскажет почему так происходит?
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы