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?
Odpowiedzi:
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.
źródło
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.
źródło
generate-content
(genc
) dostarczonej z Devel Generate;drush help genc
dla informacji o użytkowaniu.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.
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ą.
źródło
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:
źródło
node_delete()
(nawet nie zawraca sobie głowynode_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.drush delete-all article
aby usunąć artykuły, wybrałbym to rozwiązanie.Użyj widoków Operacje zbiorcze - to był dobry pomysł. Ale zamiast bezpośrednio wywoływać operację, użyj wsadowego interfejsu API. Tutaj możesz przeczytać krótki artykuł na ten temat. Brak dokumentacji w tej części był znanym problemem .
źródło
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.
źródło
Możesz również utworzyć dla niego proces wsadowy za pomocą BATCH API iw tym procesie wsadowym po prostu zrób
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 .
źródło
Jeśli masz powód, aby to zrobić za pomocą kodu:
Masz również wiele innych dostępnych metod wyboru węzłów do usunięcia.
źródło
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.
źródło