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


Мне нужно удалить около 13000 узлов на сайте Drupal 7. Я пробовал модуль Просмотр массовых операций для удаления 500 узлов за раз, но время ожидания истекло. Я могу удалить только 50 узлов одновременно.

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

 11
Author: kiamlaluno, 2013-06-14

10 answers

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

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

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

 18
Author: Clive, 2017-05-23 12:41:25

Установите Devel. Затем перейдите в раздел администратор/конфигурация/разработка/создание/контент в D7 и выберите все типы контента. Установите флажок "Удалить все содержимое". Введите 0 в поле "Сколько узлов вы хотели бы сгенерировать?"

Нажмите кнопку Создать.

Это приведет к удалению всех узлов.

 8
Author: AgA, 2013-06-14 09:37:11

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

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

Drush vbo-выполнить действие my_view::views_bulk_operations_delete_item::просмотры_операций_детали

Где my_view - имя машины вашего представления

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

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

 5
Author: davewilly, 2015-05-31 09:51:38

Там есть Удалить все модуль. Это приведет к удалению всех узлов и/или пользователей с сайта.

Он также имеет поддержку 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.
 3
Author: AjitS, 2013-06-14 09:42:43

Использовать массовые операции с представлениями - это была хорошая идея. Но вместо того, чтобы вызывать операцию напрямую, используйте пакетный api. Здесь вы можете прочитать короткую статью об этом. Отсутствие документации по этой части было известной проблемой.

 1
Author: Mołot, 2013-06-14 09:40:39

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

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

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

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

 1
Author: neetu morwani, 2013-06-14 12:36:51

Вы также можете создать для него пакетный процесс с помощью ПАКЕТНОГО API, и в этом пакетном процессе просто выполните

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

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

 1
Author: Deepak Kumar, 2013-06-19 10:55:42

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

$query = new EntityFieldQuery();

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

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

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

 1
Author: Bobík, 2016-08-18 19:55:00

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

 1
Author: Emmanuel Buckshi, 2017-04-03 15:00:44

На Drupal 8 другой способ - удалить несколько объектов, не загружая их все одновременно, но по частям.

Вы можете использовать меньше памяти и иметь большую производительность:

$nids = \Drupal::entityQuery("node")
  ->condition("type", "my_bundle")
  ->execute();

$storage_handler = \Drupal::entityTypeManager()->getStorage("node");

if (!empty($nids)) {
  foreach (array_chunk($nids, 50) as $chunk) {
    $nodes = $storage_handler->loadMultiple($chunk);
    $storage_handler->delete($nodes);
  }
};

Для большего удобства вы можете запустить его внутри команды drush php-eval:

drush php-eval '$nids = \Drupal::entityQuery("node")->condition("type", "my_bundle")->execute(); $storage_handler = \Drupal::entityTypeManager()->getStorage("node"); if (!empty($nids)) {   foreach (array_chunk($nids, 50) as $chunk) { $nodes = $storage_handler->loadMultiple($chunk); $storage_handler->delete($nodes); }};'
 1
Author: Flo Develop, 2020-06-03 20:38:16