За последние 24 часа нас посетили 18423 программиста и 1606 роботов. Сейчас ищут 974 программиста ...

Преобразование sql запроса в xml на php

Тема в разделе "PHP и базы данных", создана пользователем var_fj54j, 22 май 2013.

  1. var_fj54j

    var_fj54j Новичок

    С нами с:
    23 апр 2013
    Сообщения:
    11
    Симпатии:
    0
    Добрый день! Написал скрипт, который выполняет запрос на mysql и преобразует его в xml формат. Проблема в том, что скрипт выполняется очень долго, данные не до конца преобразуются в xml и завершается работа скрипта сообщением о превышении лимита времени. Лимит времени выставил 360 секунд. Запрос в mysql выполняется за 10 секунд. Я так понимаю, что вся загвоздка в преобразовании в xml. Преобразования делаю через DOM. Подскажите, что можно сделать, что бы все преобразовывалось быстро.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Если "через DOM" означает что все данные надо сначала впихнуть в объект, только потом можно что-то сделать....
    Короче когда имеешь дело с большим объемом данных, надо работать с данными как с потоком: обрабатывать по мере поступления, не копить.

    XML это ведь просто текст, размеченный определенным нехитрым образом! Не надо вам никаких библиотек для него. Просто выводите текст: сперва некий заголовок, а потом в цикле: одна запись => вывод одной строки XML, по завершении цикла закрывающие теги XML. Так вы получите время чуть-чуть больше, чем время добычи данных из mysql.
     
  3. var_fj54j

    var_fj54j Новичок

    С нами с:
    23 апр 2013
    Сообщения:
    11
    Симпатии:
    0
    После выполнения запроса все полученные значения записываются в переменную с помощью функции mysql_fetch_array, а уже потом в цикле из переменной достаю данные и вставляю в нужные теги xml. artoodetoo, можете поподробней объяснить про "Просто выводите текст: сперва некий заголовок, а потом в цикле: одна запись => вывод одной строки XML, по завершении цикла закрывающие теги XML."
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Сперва вы расскажите сколько примерно строк выдает ваш запрос, что за "переменная", что значит "через DOM" и что значит "вставляю в нужные теги". Есть варианты! :)
    Лучше всего скопируйте сюда рабочий цикл. А то может я домысливаю чего неправильно.
     
  5. var_fj54j

    var_fj54j Новичок

    С нами с:
    23 апр 2013
    Сообщения:
    11
    Симпатии:
    0
    Код (Text):
    1. ...
    2. $vidpolis = mysql_query("SELECT *FROM Table);
    3.  // создаю объект DOM
    4. $dom = new domDocument("1.0", "windows-1251");
    5. $dom->preserveWhiteSpace = false;
    6. $dom->formatOutput = true;
    7. ...
    8. $i=0;
    9. while ($vdp = mysql_fetch_array($vidpolis)){   
    10.     $i++;
    11.          ...
    12.     // далее заполняю теги в xml данными
    13.     $id_pac = $pacient->appendChild($dom->createElement("ID_PAC"));
    14.     $id_pac->appendChild($dom->createTextNode($i));
    15.     $vpolis = $pacient->appendChild($dom->createElement("VPOLIS"));
    16.     $vpolis->appendChild($dom->createTextNode($vdp[policyType_id]));
    17.     $npolis = $pacient->appendChild($dom->createElement("NPOLIS"));
    18.     $npolis->appendChild($dom->createTextNode($vdp[number]));
    19.     $smo = $pacient->appendChild($dom->createElement("SMO"));
    20.     $smo->appendChild($dom->createTextNode($vdp[infisCode]));
    21. ...
    22. // и всё сохраняем в файл
    23.     $dom->save("D:/HM460061T.xml");    
    24. }
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Вы что, реально сохраняете при каждой итерации цикла? Тогда неудивительно, что так долго. Вынесите save() ниже }

    Добавлено спустя 6 минут 57 секунд:
    Это если ничего не менять, а только исправить косяк.

    А на самом деле я советовал вам заглянуть в готовый XML и сделать примерно так:
    Код (PHP):
    1. // шапка XML
    2. echo "<?xml version=\"1.0\" encoding=\"windows-1251\"?>
    3. <polises>
    4. ";
    5. // пошли элементы
    6. while ($vdp = mysql_fetch_array($vidpolis)) {
    7.   echo "
    8. <VPOLIS>{$vdp[policyType_id]}</VPOLIS>
    9. <NPOLIS>{$vdp[number]}</NPOLIS>
    10. ";
    11. } 
    12. // элементы кончились, закрываем набор
    13. echo "
    14. </polises>
    15. ";
    Данные я тут привел от балды, надеюсь принцип понятен? Не копим, а сразу выводим. Память не тратится, накладные расходы на вывод минимальные.

    Добавлено спустя 7 минут 36 секунд:
    Между делом замечания по mysql:
    1. расширение mysql устарело и про него надо начинать забывать. Пользуйтесь аналогичными функциями mysqli
    2. Мы вродебы говорим о БОЛЬШОМ количестве данных. mysql_query работает так: если операция успешна, результат ПОЛНОСТЬЮ выкачивается и помещается в буфер клиента и потом по мере fetch выдается в приложение. вместо этого можно воспользоваться НЕбуферизирующей версией mysql_unbuffered_query. она медленнее, но память клиента mysql расходуется экономнее. это может быть критически важно.
     
  7. var_fj54j

    var_fj54j Новичок

    С нами с:
    23 апр 2013
    Сообщения:
    11
    Симпатии:
    0
    Спасиб, вам, большое. Все получилось так так надо, всё формируется и быстро выгружается. По поводу сохранения каждый раз. Да, затупил не много. Чё-то показалось, что он добавляет каждую итерацию цикла в конец файла. Вот и сделал сохранение в конце цикла.