Как избежать ошибок "нехватка памяти" при программном создании большого количества узлов в drupal?
Я создаю около 150 узлов программно и сталкиваюсь с ошибками "недостаточно памяти", когда делаю все это в одном запросе. (У меня есть обратный вызов меню, который генерирует узлы и вызывает для них node_save().)
Пример:
for($i=0; $i<150; $i++) {
$node = new stdClass();
$node->title="Foo $i";
$node->field_myfield[0]['value'] = "Bar $i";
...
node_save($node);
}
Я слышал о BatchAPI, но никогда не использовал его. Это правильный инструмент, чтобы обойти это? Документы говорят о тайм-аутах, но не о проблемах с памятью. Есть что-то более простое, что я мог бы пропустить?
2 ответа
Да, Batch API может решить эту проблему. Это разделит использование вашей памяти на отдельные HTTP-запросы, каждый с доступом к вашему полному ограничению памяти.
Вы когда-нибудь пользовались Views Bulk Operations? ( http://drupal.org/project/views_bulk_operations) он поставляется со связанным представлением, отображаемым по адресу admin/content/node2, вы можете отредактировать его, чтобы включить действие "Выполнить код PHP", а также включить пакетный API. это самый простой способ программно изменить узлы.
однако, так как вы создаете узлы, вы просто должны сбросить $node в конце инструкции, и это должно снизить использование вашей памяти. пытаться:
for($i=0; $i 150; $i++) {
$node = new stdClass();
$node->title="Foo $i";
$node->field_myfield[0]['value'] = "Bar $i";
...
node_save($node);
unset($node);
}
}