Usuń 13000 węzłów

9

Mam około 13000 węzłów do usunięcia na stronie Drupal 7. Próbowałem modułu Views Bulk Operations , aby usunąć 500 węzłów jednocześnie, ale upłynął limit czasu. Jednocześnie mogę usunąć tylko 50 węzłów.

Jak mogę usunąć więcej niż 50 węzłów jednocześnie?

chaithanya
źródło
Kiedyś istniał moduł „zbiorczego usuwania”, ale stał się przestarzały na korzyść VBO. Ale VBO wydaje się wspierać przetwarzanie wsadowe. Próbowałeś go użyć?
Mołot
1
VBO, jak wskazano w odpowiedziach poniżej, jest prawdopodobnie właściwą drogą. To, co zrobiłem w czasach potrzeby usunięcia o wiele większej liczby węzłów niż w tym przypadku, to wywołanie modułu hakerskiego w celu zignorowania wielu wywołań hooków, których nie potrzebuję. (Moim najgorszym przestępcą był apache solr). Może to znacznie przyspieszyć pracę, ale oczywiście należy to zrobić z dużą ostrożnością.
Letharion

Odpowiedzi:

16

VBO jest de facto standardem dla usuwania masowo węzłów, po prostu nie ma lepszego sposobu na zrobienie tego.

Ponieważ VBO przetwarza partie, wykonuje tylko 1 (a może kilka) węzłów naraz. Więc jeśli otrzymujesz błędy przekroczenia limitu czasu, są one związane z usunięciem pojedynczego węzła, a nie z całą operacją wsadową.

Standardową rozdzielczością do czegoś takiego jest zwiększenie maksymalnego czasu wykonania PHP w celu skompensowania.

Clive
źródło
2
Wystarczy wypełnić odpowiedź: możesz wybrać, ile podmiotów ma zostać odebranych do operacji. Używanie 100 da sobie radę w ciągu ~ 1 minuty od mojego doświadczenia.
AyeshK
7

Zainstaluj Devel. Następnie przejdź do admin / config / development / generate / content w D7 i wybierz wszystkie typy treści. Zaznacz „Usuń całą zawartość”. Wpisz 0 w „Ile węzłów chcesz wygenerować?”

Kliknij Generuj.

Spowoduje to usunięcie wszystkich węzłów.

Aga
źródło
1
@ Mołot „ Zaznacz„ Usuń całą zawartość ” ” ... ”Wpisz 0 w„ Ile węzłów chcesz wygenerować? ”” ...;)
Clive
@Clive OK, mój błąd, przepraszam.
Mołot
1
W szczególności robi to moduł Devel Generate; jest dostarczany z Devel, ale nie dostaniesz tej funkcji, jeśli tylko włączysz Devel. W ten sposób możesz również łatwo usunąć wszystkie węzły określonego typu treści , jeśli nie chcesz wszystkiego usuwać. Jeśli nadal masz limity czasu PHP i nie boisz się interfejsu CLI, możesz także użyć komendy Drush generate-content( genc) dostarczonej z Devel Generate; drush help gencdla informacji o użytkowaniu.
Garrett Albright
3

Użyj VBO i uruchom go z Drusha. Zastosowałem następującą metodę, aby usunąć ponad 1,5 miliona węzłów po testowaniu skali.

  1. Utwórz nowy widok ze stroną. Ustaw filtry odpowiednio, aby wyświetlały tylko typ węzłów, które chcesz usunąć.
  2. Dodaj nowe pole: „Operacje zbiorcze: treść”
  3. Zaznacz pole obok „Usuń element” w „Wybranych operacjach masowych”.
  4. Zapisz widok.
  5. Zakładając, że wiesz, jak korzystać z Drush, uruchom następującą komendę: (Użyj linuksowego „ekranu”, aby działać nieprzerwanie dla dużych zestawów danych)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Gdzie my_view to nazwa komputera twojego widoku

Możesz również użyć drbo vbo-list, aby wyświetlić wszystkie dostępne widoki i ich operacje zbiorcze.

VBO powinien teraz działać w powłoce, dając ci informację zwrotną.

Davewilly
źródło
2

Istnieje moduł Usuń wszystko . Spowoduje to usunięcie wszystkich węzłów i / lub użytkowników z witryny.

Ma również wsparcie Drush:

Przykłady:

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
źródło
7
Zdecydowanie odradzam korzystanie z tego modułu - ustawia limit czasowy skryptu na 30 sekund i uruchamia się przez każdy węzeł osobno , dzwoniąc node_delete()(nawet nie zawraca sobie głowy node_delete_multiple()). Jeszcze bardziej niepokojące jest to, że usuwa dane bezpośrednio z tabel bazy danych bez użycia interfejsu API pola i bez haków. Żadnych zadań wsadowych, działa tylko do momentu śmierci skryptu. Bardzo niebezpieczny moduł IMHO.
Clive
2
Może być nadal przydatny, jeśli wiesz, co robisz i wykonujesz kopie zapasowe. Usuwanie tysięcy węzłów podczas wywoływania wszystkich haków i apis może być boleśnie powolne. :(
Letharion
@Letharion Bez bólu, bez zysku;) Masz rację, oczywiście, pomyślałem, że po prostu lepiej zrzeknę się tego zrzeczenia się odpowiedzialności, ponieważ ten moduł może sprawić, że sprawy staną się nieporządne, jeśli znajdą się w niewłaściwych rękach!
Clive
@Clive Z obsługą drush, jeśli mogę zrobić, drush delete-all articleaby usunąć artykuły, wybrałbym to rozwiązanie.
AjitS
@develkar Dla kilkuset węzłów może to być w porządku, ale rozszerzenie drush używa dokładnie takich samych funkcji jak wersja na stronie, więc niestety jest tak samo podatne na przekroczenia limitu czasu
Clive
0

Aby usunąć węzły w dużej liczbie (tj. Jest to zbiorcze), jak w twoim przypadku, możesz również użyć do tego modułu usuwania zbiorczego .

To wykorzysta Batch API do usunięcia węzłów, aby uniknąć problemów z przekroczeniem limitu czasu lub pamięci podczas usuwania tysięcy węzłów za pomocą jednego wywołania metody node_delete_multiple ().

Oprócz tego możesz nawet spróbować Usuń cały moduł, aby usunąć wszystkie węzły typu zawartości.

Mam nadzieję że to pomoże.

neetu morwani
źródło
0

Możesz również utworzyć dla niego proces wsadowy za pomocą BATCH API iw tym procesie wsadowym po prostu zrób

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

Otóż ​​to. Skończysz tutaj. Jeśli chcesz utworzyć dla niego polecenie drush, możesz je również utworzyć. W celach informacyjnych spójrz na to .

Deepak Kumar
źródło
0

Jeśli masz powód, aby to zrobić za pomocą kodu:

$query = new EntityFieldQuery();

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

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

Masz również wiele innych dostępnych metod wyboru węzłów do usunięcia.

Bobík
źródło
0

Możesz wziąć radę Bobika i nakarmić to jako argument „drush php-eval”, jeśli naprawdę jesteś w szczypcie, ale oczekiwałbym, że wydajność będzie podobna do VBO, a jednocześnie nieco szybsza. Jeśli wydajność jest naprawdę niska, możesz rzucić okiem na to, jakie moduły wywołują hook_node_delete, przeszukując bazę kodu dla „_node_delete (”), a następnie określając, czy możesz wyłączyć niektóre moduły korzystające z tego hooka.

Emmanuel Buckshi
źródło