Удалить 13000 узлов

9

У меня есть около 13000 узлов для удаления на сайте Drupal 7. Я попробовал модуль Views Bulk Operations для удаления 500 узлов одновременно, но время ожидания истекло. Я могу удалить только 50 узлов одновременно.

Как я могу удалить более 50 узлов одновременно?

чайтанья
источник
Раньше был модуль «массового удаления», но он устарел в пользу VBO. Но VBO, кажется, поддерживает пакетную обработку. Вы пытались использовать это?
Молот
1
VBO, как указано в ответах ниже, это, вероятно, путь. Иногда мне нужно было удалять на порядок больше узлов, чем в этом случае, это вызывать хак-модуль, чтобы игнорировать множество вызовов хуков, которые мне не нужны. (Мой худший преступник был Apache Solr). Это может значительно ускорить работу, но, очевидно, должно быть сделано с большой осторожностью.
Летарион

Ответы:

16

VBO является стандартом де-факто для массового удаления узлов, просто нет лучшего способа сделать это.

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

Стандартным разрешением чего-то подобного является увеличение максимального времени выполнения PHP для компенсации.

Клайв
источник
2
Просто чтобы завершить ответ: вы можете выбрать, сколько объектов должно быть выбрано для операции. Использование 100 будет хорошо через ~ 1 минуту из моего опыта.
AyeshK
7

Установите Devel. Затем перейдите к admin / config / development / generate / content в D7 и выберите весь тип контента. Отметьте «Удалить все содержимое». Введите 0 в поле «Сколько узлов вы хотите сгенерировать?»

Нажмите Создать.

Это удалит все узлы.

AGA
источник
1
@ Mołot ' Проверить "Удалить все содержимое" ' ... 'Введите 0 в поле " Сколько узлов вы хотите сгенерировать?"' ...;)
Клайв
@Clive Хорошо, моя ошибка, прости.
Молот
1
В частности, это модуль Devel Generate, который делает это; он поставляется вместе с Devel, но вы не получите эту функциональность, если просто включите Devel. Вы также можете легко удалить все узлы определенного типа контента , если не хотите удалять все. Если вы все еще получаете тайм-ауты PHP и не боитесь CLI, вы также можете использовать команду Drush generate-content( genc), которая поставляется с Devel Generate; drush help gencдля использования информации.
Гаррет Олбрайт,
3

Используйте VBO и выполните его из Drush. Я использовал следующий метод для удаления более 1,5 миллионов узлов после масштабного тестирования.

  1. Создайте новый вид со страницей. Установите фильтры соответствующим образом, чтобы отображать только тот тип узлов, который вы хотите удалить.
  2. Добавьте новое поле: «Массовые операции: содержимое»
  3. Установите флажок рядом с «Удалить элемент» в разделе «Выбранные массовые операции».
  4. Сохранить вид.
  5. Предполагая, что вы знаете, как использовать Drush, запустите эту команду: (Используйте linux 'screen', чтобы непрерывно запускать большие наборы данных)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Где my_view - имя машины вашего вида

Вы также можете использовать drush vbo-list для отображения всех доступных представлений и их массовых операций.

VBO теперь должен работать в оболочке, давая вам обратную связь по ходу дела.

davewilly
источник
2

Там есть модуль Удалить все . Он удалит все узлы и / или пользователей с сайта.

Он также имеет поддержку Drush:

Примеры:

drush delete-all article             Delect all article nodes.  
drush delete-all all                 Delete nodes of all types.  
drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.  
drush delete-all users               Delete users.
AjitS
источник
7
Я настоятельно рекомендую не использовать этот модуль - он устанавливает для скрипта ограничение по времени в 30 секунд и проходит через каждый узел отдельно , вызывая node_delete()(он даже не удосуживается использовать node_delete_multiple()). Еще более тревожно то, что у него есть опция, которая удаляет данные непосредственно из таблиц базы данных без использования API полей и без использования хуков. Пакетных заданий вообще нет, он просто запускается до тех пор, пока скрипт не умрет. Очень опасный модуль ИМХО.
Клайв
2
Может быть полезно, если вы знаете, что делаете, и делаете резервные копии. Удаление тысяч узлов при вызове всех хуков и apis может быть мучительно медленным. :(
Летарион
@Letharion Никакой боли, никакой выгоды;) Вы, конечно, правы, хотя я бы лучше дал по этому поводу отказ от ответственности, так как этот модуль мог бы запутаться, если бы не в те руки!
Клайв
@Clive С поддержкой drush, если мне удастся drush delete-all articleудалить статьи, я бы выбрал это решение.
AjitS
@develkar Для нескольких сотен узлов это может быть хорошо, но расширение drush использует точно такие же функции, что и локальная версия, поэтому, к сожалению, оно все еще подвержено тайм-аутам
Клайв
0

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

При этом будет использоваться пакетный API для удаления узлов, чтобы избежать проблем с тайм-аутом или памятью при удалении тысяч узлов одним вызовом node_delete_multiple ().

Помимо этого, вы можете даже попробовать Удалить все модули для удаления всех узлов типа контента.

Надеюсь это поможет.

Ниту Морвани
источник
0

Вы также можете создать пакетный процесс для него, используя BATCH API, и в этом пакетном процессе просто выполните

foreach($nodes as $node){ node_delete($node[nid]);}

Это оно. Вы сделали здесь. Если вы хотите создать для нее команду drush, вы также можете создать ее. Для справки, пожалуйста, посмотрите на это .

Дипак Кумар
источник
0

Если у вас есть причина сделать это с помощью кода:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->propertyOrderBy('nid', 'DESC')
  ->range(1000, 1000);

$result = $query->execute();
node_delete_multiple(array_keys($result['node']));

У вас также есть много других доступных методов для выбора узлов для удаления.

Бобик
источник
0

Вы можете принять совет Бобика и использовать его в качестве аргумента «drush php-eval», если вы действительно в затруднении, но я ожидаю, что производительность будет похожа на VBO, но будет немного быстрее. Если производительность действительно низкая, вы можете посмотреть, какие модули вызывают hook_node_delete, выделив кодовую базу для «_node_delete (») и затем определив, можете ли вы отключить некоторые из модулей, использующих этот хук.

Эммануэль Бакши
источник