Видаліть 13000 вузлів


9

У мене є близько 13000 вузлів, які потрібно видалити на сайті Drupal 7. Я спробував модуль « Масові операції перегляду», щоб одночасно видалити 500 вузлів, але час вичерпується. Я можу видалити лише 50 вузлів за один раз.

Як я можу видалити більше 50 вузлів одночасно?


Раніше був модуль "масового видалення", але застарів на користь VBO anwyay. Але VBO, здається, підтримує пакетну обробку. Ви намагалися його використовувати?
Молот

1
VBO, як зазначено у відповідях нижче, ймовірно, це шлях. Те, що я робив, коли потрібно видалити вузли на величину більше, ніж у цьому випадку, - це виклик модуля злому, щоб ігнорувати безліч викликів гачків, які мені не потрібні. (Моїм найгіршим злочинцем був апаш-соль). Це може значно пришвидшити роботу, але очевидно, що це потрібно робити дуже обережно.
Летаріон

Відповіді:


16

VBO є фактичним стандартом для масового видалення вузлів, просто немає кращого способу зробити це.

Оскільки VBO обробляє партіями, він одночасно робить лише 1 (а може і пару) вузлів. Отже, якщо ви отримуєте помилки в режимі очікування, вони пов'язані з видаленням одного вузла, а не з цілою пакетною операцією.

Стандартне дозвіл на щось подібне - збільшити максимальний час виконання PHP для компенсації.


2
Тільки для завершення відповіді: Ви можете вибрати, скільки об'єктів слід підібрати для операції. Використовуючи 100, це буде чудово за ~ 1 хвилину з мого досвіду.
АйешК

7

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

Клацніть Створити.

Це видалить усі вузли.


1
@ Mołot 'Поставити прапорець "Видалити весь вміст" ' ... 'Введіть 0 у "Скільки вузлів ви хочете створити?"' ...;)
Clive

@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 для безперебійного запуску для великих наборів даних)

drush vbo-Execute my_view action :: views_bulk_operations_delete_item

Де my_view - це ім'я машини вашого перегляду

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

Тепер VBO повинен працювати в оболонці, надаючи вам зворотній зв'язок.


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.

7
Я настійно рекомендую не використовувати цей модуль - він встановлює часовий ліміт 30 секунд для сценарію і працює через кожен вузол окремо , викликаючи node_delete()(це навіть не турбує використання node_delete_multiple()). Що ще більше хвилює, у неї є опція, яка видаляє дані безпосередньо з таблиць баз даних, не використовуючи API поля та не використовуючи гачки. Пакетних завдань взагалі немає, він просто працює, поки сценарій не відмирає. Дуже небезпечний модуль ІМХО.
Клайв

2
Можливо, все-таки стане в нагоді, якщо ви знаєте, чим займаєтесь, і зробите резервні копії. Видалення тисяч вузлів при виклику всіх гачків і апіс може бути болісно повільним. :(
Летаріон

@Letharion Ні болю, ні виграшів;) Ви, звичайно, маєте рацію, я хоч краще за все відмовитись відмовитись від цього, оскільки цей модуль може зробити безладдям, якщо не в інших руках!
Клайв

@Clive З підтримкою друку, якщо мені drush delete-all articleдоведеться видаляти статті, я б пішов на це рішення.
AjitS

@develkar Для кількох сотень вузлів, що може бути нормальним, але розширення барабану використовує точно такі ж функції, як і на сайті, тож воно все одно настільки ж сприйнятливе до тайм-аутів, на жаль
Clive


0

Для видалення вузлів у великій кількості (тобто масово), як у вашому випадку, ви також можете використати для цього модуль групового видалення .

Це використовує пакетний API для видалення вузлів, щоб уникнути затримки часу або пам’яті при видаленні тисяч вузлів одним викликом node_delete_multiple ().

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

Сподіваюсь, це допомагає.


0

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

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, при цьому буде трохи швидшою. Якщо продуктивність дуже повільна, ви можете поглянути на те, які модулі викликають гачку_node_delete, натиснувши базу коду для '_node_delete (', а потім визначити, ви можете відключити деякі модулі, які використовують цей гачок чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.