Импорт/обновление большого количества материалов по Cron без использования Batch API и Drupal Queue

Часто бывает необходимо импортировать или обновить большое количество материалов на сайте. Чтобы все модули отработали правильно, необходимо сохранять ноды с помощью функций node_submit и node_save.
К сожалению, в этом случае, время выполнения скрипта будет довольно большим по сравнению с непосредственной записью в базу данных.

Для того, чтобы разбить процесс обработки данных на части, и чтобы скрипт не вылетал по тайм-ауту придумали Drupal Batch API. Великолепная идея, но у нее есть один минус – оно требует присутствия человека. Т.е. операцию необходимо запустить из браузера, и браузер должен быть открыт во время всего процесса выполнения. Что же делать, если нам нужна обработка по Cron?

Самый простой способ без использования каких-либо наворотов.

1. Создаете модуль, который импортирует данные (например из файла на хостинге) во временную таблицу базы данных. Запись в базу даже большого количества данных занимает небольшое время.

2. В модуле по hook_cron вызываете функцию импорта/обновления, после чего удаляете обработанные строки временной базы данных.

Единственный минус такого решения – чем больше у вас данных, тем чаще необходимо запускать Cron, а это не всегда приемлемо.

Кто знает более простое решение – милости прошу в комменты.

Оригинал живет здесь

Источник: http://www.drupal.ru/node/83513

Cron Splitter – модуль для разбиения работы крона на части.

Не смог найти нужного модуля, поэтому попытался написать сам, выкладываю что получилось, если кто знает модуль реализующий нужную мне возможность (описание ниже) отпишитесь, не хочу изобретать велосипед. С радостью выложил бы на drupal.org но не знаю как, поделитесь как это сделать.

Описание:
Модуль лишь помощник для других модулей. Столкнулся с такой проблемой, на сайте который будет вести различную статистику, необходим постоянный перерасчёт, и реализован пока 1 модуль, но скоро их будет несколько. Нужно не только разбить выполнение одного модуля на части но и сделать выполнение модулей поочерёдно. Для примера задача перерасчёта для одного модуля целиком выполняется 2 дня. Но можно разбить на логические части выполнение каждой по 5 мин, что приемлемо с расчётом запуска крона каждые 10 мин. Но если модулей будет 10 и каждый будет иметь работу на 5 мин, а при добавлении 11-го модуля заново в ручную выставлять время для каждого модуля модуля чтобы не пересекались просто кошмарно =)

Коротко:
Модуль запоминает который модуль работал в последний раз и при следующем вызове крона отдаёт право работы следующему по списку модулю. При этом для каждого модуля имеет индекс задачи и подзадачи, их естественно тоже запоминает и когда очередь вновь дойдёт до этого модуля он вызовется со следующими по списку индексами.

Использование:
В своём модуле нужно реализовать 3 хука.

1. хук должен вернуть кол-во задач нужных этому модулю. Например если задач 4 то просто

function hook_cron_splitter_parts() { return 4; }

2. хук должен вернуть кол-во подзадач нужных этому модулю для конкретной задачи. Например если подзадач 40*20=800 для задачи 3 а для остальных по одной, то функция будет выглядеть так:

function hook_cron_splitter_subparts($index) { switch ($index) { case 3: return 40*20; default: return 1; } }

3. хук должен описывать саами задачи, т.е. замена стандартного hook_cron()

function hook_cron_splitter_tick($index, $subIndex) { switch ($index) { case 0: // Здесь задача 1 break; case 1: // Здесь задача 2 break; case 2: // Здесь задача 3 break; case 3: // Здесь задача 4 которая состаит из подзадач которая тоже состоит из подзадач // Да такая мега затратная задача мне попалась, которую копипайстить неохота, т.к. не китаец =)) а разбить на части надо $currentSubTask = (int)($subIndex / 20); $currentSubSubTask = $subIndex % 20; // далее логика... break; } }

Сам модуль:

Прикрепленный файл Размер cron_splitter.zip 1.83 кб

Источник: http://www.drupal.ru/node/41748

© 2009 Обзор CMS