[Помогите] Из XML собрать в массив

Тема в разделе "PHP", создана пользователем MilkeyWay, 3 янв 2018.

Модераторы: latteo
  1. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    Всем привет!

    Ребят,помогите дособрать данные в массив из XML,у меня произошел клин...походу утечка памяти...возможно в голове моей))

    Код:
    $xml = new SimpleXMLElement($dat->xml,LIBXML_NOCDATA);
          
            $data = array();
            $img = array();
    
      $y = 0;
    
    foreach ($xml as $item) {
    
      $x = 0;
    foreach ($item->images->item as $i) {  //тут происходит касяк,либо памяти не хватает(выделил 6гб),либо времени не хватает на обработку (1мин),если больше времени,то все зависает
             $q = (string) $i->attributes()->type;
               $img[$y][$q][$x] = $i;
               $x++;
    }
          
      $y++;
    
    $data[] = array(
             'product_id' => (int) $item->attributes()->id,
             'images'  => $img,  //проблема с добавлением картинок в массив
             'name'  => (string) $item->name,
             'price_retail' => (float) $item->attributes()->price_retail,
             'price_wholesale' => (float) $item->attributes()->price_wholesale,
             'price_retail_stock' => (float) $item->attributes()->price_retail_stock,
             'price_wholesale_stock' => (float) $item->attributes()->price_wholesale_stock,
             'date_change' =>  (string) $item->attributes()->date_change,
             'datetime_release' =>  (string) $item->attributes()->datetime_release,
             'archive' => (int) $item->attributes()->archive,
             'publication' => (int) $item->attributes()->publication,
             'available' => (int) $item->attributes()->available,
             'release' => (int) $item->attributes()->release,
             'description' => (string) $item->description
        );
    }
    
    
    или получаю такое в логах:

    Код:
    child pid 12177 exit signal Segmentation fault (11), possible coredump in /etc/apache2

    xml:

    Код:
    [xml] => <?xml version="1.0" encoding="UTF-8"?><products><item id="407" date_change="2016-10-24 18:20:43" datetime_release="2014-09-19 00:00:00" price_retail="100" price_wholesale="50" price_retail_stock="0" price_wholesale_stock="0" release="1" archive="0" publication="1" available="1">
      <name><![CDATA[название]]></name>
      <name_eng><![CDATA[]]></name_eng>
    <description><![CDATA[Описание]]></description>
    <images>
      <item type="screenshot"><![CDATA[0.jpg]]></item>
      <item type="screenshot"><![CDATA[1.jpg]]></item>
      <item type="screenshot"><![CDATA[2.jpg]]></item>
      <item type="screenshot"><![CDATA[3.jpg]]></item>
      <item type="screenshot"><![CDATA[4.jpg]]></item>
      <item type="screenshot"><![CDATA[5.jpg]]></item>
      <item type="main"><![CDATA[6.jpg]]></item>
      </images>
    
    
    Объясните на пальцах,что не так делаю?(как картинки закинуть в массив,с учетом type?)
     
    Последнее редактирование: 4 янв 2018
  2. romas_s

    romas_s

    Регистр.:
    9 ноя 2012
    Сообщения:
    257
    Симпатии:
    75
    Тебе нужно поделить запрос на маленькие порции.
    Где то видел тему на nulled-mirror.com, только не помню как называлась, где твой вопрос (похожий) ранее уже обсуждался и там советовали разбить запрос JS на маленькие порции.

    Если найду тему, скину ссылку.

    попробуй вывести значение $i, если значение больше 1000 - вывести сообщение с ошибкой и прервать цикл, может цикл вечный и т д.
     
    MilkeyWay нравится это.
  3. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    мне бы на PHP(SimlpeXML). товаров более 2000,где-то картинки есть,где-то нет

    зы надеюсь,что найдешь тему,с радостью глянул бы,т.к с XML знакомлюсь 3дня,все бы ничего,а уже 2 дня мозг ломаю,на ютубе видео в основном зарубежное((
     
  4. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    ни у кого нет мыслей на этот счет?
     
  5. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    за 1к руб. ктонить сможет дособрать картинки в массив,с видом:

    array:
    [screenshot]=[0]=>[http...][1]=>[http...]
    [main]=[0]=>[http...]
    и т.д

    как-то так
     
    Последнее редактирование: 5 янв 2018
  6. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    256
    Симпатии:
    60
    Можно не сохранять все данные в массив, ведь их придётся потом в БД загружать. Не так ли?
    А если скинешь файл, то я готов в течение пары дней "потыкать в него палкой" и предложить решение.
     
    MilkeyWay нравится это.
  7. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    потом,да,в бд. но не уловил смысл-почему не стоит добавлять все данные в массив?

    файла нет,данные от поставщика по товарам получаю через curl,в ответ xml. структура xml пойдет?

    зы хотя структура xml в 1м сообщении,далее после картинок идут файлы на скачку...видео и т.д,но на данный момент важны картинки
     
  8. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    256
    Симпатии:
    60
    Через curl получаете xml. Разве его нельзя сохранить в файл. Заодно узнать его размер.

    А не проще ли не забивать память, а сразу добавлять в БД. Хотя бы даже во временную таблицу, а потом согласовать, если не просто замена.
     
    MilkeyWay нравится это.
  9. MilkeyWay

    MilkeyWay Постоялец

    Регистр.:
    11 июл 2011
    Сообщения:
    144
    Симпатии:
    10
    смысл уловил вроде,картинки лишние в массиве...просто изначально,как планировалось-полученные данные будут сначала выводиться,потом выбранные товары или все будут добавляться в бд,но,понял,в картинках смысла нет в массиве-просто смотреть на них,проще сразу добавлять в бд(но сначала нужно видеть,что добавлять,а что нет)

    зы в файле получится более 2000 товаров,мб есть варианты еще?

    зыы и мб дело не в памяти?-просто посмотрел на полученные данные,предыдущие картинки почему-то прибавлятся к новым в сл. итерации(дублируются как бы)...

    зыыы 12гб памяти,2000товаров,в товаре 5-10 картинок и то не во всех,думаю дело не в массиве,а в фориче скорее...что скажите?
     
    Последнее редактирование: 6 янв 2018
  10. fpinger

    fpinger

    Регистр.:
    11 май 2007
    Сообщения:
    256
    Симпатии:
    60
    Вот приставь. В памяти xml, размер которого так и не озвучили, а только количество записей. Кроме этого xml кода ещё и SimpleXMLElement объект на основе него. К ним добавляем ещё и массив. Это ещё не понятно что там кроме этого.

    С другой стороны - да возможно не память. Нужно настроить правильно логирование в php и точно увидеть в логе реальные ошибки. Что превышение памяти, что превышение времени выполнения - всё это можно узнать из лога.