Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.02.2017 09:25:11

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Import xml

Здравствуйте.
Задача примитивная, и сам вопрос не от том "как это сделать", а о том, хватит ли памяти.
Есть дамп в xml. размер ~4 мб (50к товаров).  Собираюсь скормить этот дамп simplexml-ю. А затем, полученный массив в цикле занести в базу. Что то типо

foreach($xmlDump as $item)
{
    Model::create([
        'name' => $item['name'],
        'tags' => $item['tags'],
        ...
    ]);
}

На сервере всего 512 мб оперативы. Памяти хватит для этого?

Не в сети

#2 08.02.2017 10:56:14

skiphog
Откуда: Киров, Россия
Сообщений: 26

Re: Import xml

Память для акселераторов PHP - 128 мб
--
1с пульнул на сервер import и offers c ~9 000 товарами. Правда xml-ники эти весят каждый по ~15мб. (У вас почему-то меньше)

Далее...

set_time_limit(0); // На всякий случай

$xml = simplexml_load_file(import/offers);

....

foreach ($xml->Каталог->Товары->Товар as $product) {
  
  $data['name'] = (string)$product->Наименование;
  ...
  
  Product::updateOrCreate(
    ['1c_id' => (string)$product->Ид],
    $data
  );

}

Полет нормальный...
--
Фиг знает, что будет с 50к товарами.

Если не прокатит, то можно попробовать порциями загружать.
Бежать по xml и хранить в сессии номер итерации.
Допустим, на 1000 итерации или по max_execution_time обрывать скрипт, запускать заново и вставлять записи в базу начиная с сохраненной итерации.

Не в сети

#3 08.02.2017 16:18:34

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Import xml

skiphog пишет:

Память для акселераторов PHP - 128 мб
--
1с пульнул на сервер import и offers c ~9 000 товарами. Правда xml-ники эти весят каждый по ~15мб. (У вас почему-то меньше)

Далее...

set_time_limit(0); // На всякий случай

$xml = simplexml_load_file(import/offers);

....

foreach ($xml->Каталог->Товары->Товар as $product) {
  
  $data['name'] = (string)$product->Наименование;
  ...
  
  Product::updateOrCreate(
    ['1c_id' => (string)$product->Ид],
    $data
  );

}

Полет нормальный...
--
Фиг знает, что будет с 50к товарами.

Если не прокатит, то можно попробовать порциями загружать.
Бежать по xml и хранить в сессии номер итерации.
Допустим, на 1000 итерации или по max_execution_time обрывать скрипт, запускать заново и вставлять записи в базу начиная с сохраненной итерации.

Спасибо за подробный ответ. В дампе 5к товаров, а не 50. Это я очепятку сделал) буду пробовать.

Не в сети

Подвал раздела