За последние 24 часа нас посетили 21517 программистов и 1023 робота. Сейчас ищет 831 программист ...

Long query

Тема в разделе "PHP для профи", создана пользователем S_t_e_e_p, 15 авг 2019.

  1. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    Приветствую, подскажите пожалуйста куда копать.

    Есть скрипт который парсит xml, то есть я могу указать ссылки допустим на 5 xml файлов.
    Через foreach и метод simplexml_load_file мы парсим по очереди и заносим в БД.

    При долгой обработке выдает mysql error while sending query ID=

    Как реализовать долгое выполнение чтобы не было ошибки и все норм обработалось?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Нужно смотреть что за цикл, что за запросы
     
  3. S_t_e_e_p

    S_t_e_e_p Активный пользователь

    С нами с:
    12 июл 2012
    Сообщения:
    181
    Симпатии:
    4
    PHP:
    1. foreach ($catalogLists as $item) {
    2.     $xml = simplexml_load_file($item['url']);//получаем ссылку с БД
    3. //парсим продукцию
    4. foreach ($xml->shop->offers->offer as $offer) {
    5.    $this->addProducts($offer, $xml->shop->name); // добавляем информацию в БД
    6. }
    7. }
    Может крон, просто я не знаю куда копать вообще в таком случае?
     
    #3 S_t_e_e_p, 15 авг 2019
    Последнее редактирование: 15 авг 2019
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Скорее всего у вас слишком часто идут запросы в бд и она затыкается. Сделай добавление не по 1 записи, а например по 100 в одном запросе. То есть внутри общего цикла запускаете ещё цикл для накопления в массив 100 элементов, и создайте метод добавления записей из массива - например через implode.

    Тогда у вас будет в 100 раз реже обращение к бд
     
  5. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ну либо сделай цикл с лимитом тоисть по 200 строк обрабатывай зараз. Потом обновляй страницу на js с параметром лимита и номером файла. и продолжай парсить. Когда мне приходится записывать большие данные в БД я так и делаю разбиваю на части тогда ты и не вылетишь лимит времени ожидания браузером
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    вот на этом месте аж кровь застыла в жилах
     
  7. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    обоснуй. Мне для разового использовния вполне хватает.
     
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Dron-Boy, а чё тут обосновывать? зачем тащить JS туда где ему совсем не место. Это примерно как в анекдоте "Хорошая машина КАМАЗ, но собаки быстро устают". Ты же когда идёшь в магазин расположенный в соседнем подъезде твоего дома, ты же просто выходишь из дома и идёшь напрямую в магазин. Тебе же не приходит в голову, что бы уехать в другой город, там сесть на автобус который довезёт тебя до магазина в твоём же доме.
     
  9. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    js я использую для того что бы сделать редирект на эту же страницу с параметрами + делаю settimeout на этот редирект, если его делать на php то он происходит сразу и браузер считает это все одним запросом и браузер и время ожидания ответа сервера сбрасываться не будет. Я это тестировал.
    P.S. Если ты меня поправишь я не против, могу конечно чего то не знать.
     
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.822
    Симпатии:
    736
    Адрес:
    Татарстан
    Есть плюс - можно показывать индикацию процесса обработки

    Есть минус - если закрыл или перешёл на другую страницу, процесс закончится