Создание большого количества документов в MODX Revo?

Есть задача создать 3-4 тысячи документов (регулярный импорт каталога). Уже есть готовый ассоциативный массив.


Пробовал работать с процессором 'create':
$modx->runProcessor($processor,$line);

— это очень медленно.


Пробовал создавать объекты, типа:
$object = $modx->newObject('modResource');

— это быстрее процессоров, но недостаточно быстро.


Я не укладываюсь в лимит времени, судя по всему, из-за большого количества запросов к MySQL.


Ищу способ как решить эту задачу.


Есть идея собирать запросы в группы («пачки» по 50-100 штук, например) и потом отправлять (сохранять).

С помощью объектов это не получится ведь?

Для xPDO не нашел способа создавать ресурсы (документы) — об этом вообще мало пишут в интернете.


Есть идеи?
  • Вопрос задан
  • 5692 просмотра
Пригласить эксперта
Ответы на вопрос 3
ohm
@ohm Автор вопроса
Нашел решение, очень быстро работает. У меня получилось так:

$table = $modx->getTableName('modResource');
$sql = "INSERT INTO {$table} (pagetitle, longtitle, menutitle, alias, parent, isfolder, template, published, hidemenu, content, createdby, createdon, editedby, editedon) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
$q = $modx->prepare($sql);
$q->bindValue(1, $line['pagetitle']);
$q->bindValue(2, $line['longtitle']);
$q->bindValue(3, $line['menutitle']);
$q->bindValue(4, $line['alias']);
$q->bindValue(5, $line['parent']);
$q->bindValue(6, $line['isfolder']);
$q->bindValue(7, $line['template']);
$q->bindValue(8, '1');
$q->bindValue(9, $line['hidemenu']);
$q->bindValue(10, $line['content']);
$q->bindValue(11, 1);
$q->bindValue(12, date());
$q->bindValue(13, 1);
$q->bindValue(14, date());
$q->execute();

Спасибо интернетам:
forums.modx.com/thread/71759/populate-large-data-in-xpdo-solved
Ответ написан
@zapimir
Все эти ORM надстройки делаются для удобства программера, а не для скорости. Так что если хотите быстро добавлять значит голый SQL, причем желательно объединять запросы. Чтобы не тратить много времени на ковыряние в структуре, включите лог запросов в MySQL на локалке, и сделайте нужное действие в MODx, после чего уже смотрите, какие запросы CMS использовала, и на их основе сделайте шаблон для своих запросов.
Ответ написан
antonzaycev
@antonzaycev
Никогда не работал с MODx, но задача мне близка.
На мой взгляд у вас есть два варианта:

— Увеличить время работы скрипта (set_time_limit) дабы не было рамок во времени. Возможно скрипту так же не хватает памяти, я работал с похожей проблемой на Kohana и Doctrine в качестве ORM, катастрафически не хватало памяти (ini_set('memory_limit', '512M'))

— Все делать «ручками» и писать «голые» SQL запросы к базе. Минусов в этом варианте море — от большего шанса ошибиться до потери большого количества времени на разбор структуры и связей в базе.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы