Elimina 13000 nodi


9

Ho circa 13000 nodi da eliminare in un sito Drupal 7. Ho provato il modulo Operazioni collettive di Views per eliminare 500 nodi alla volta, ma è scaduto. Posso eliminare solo 50 nodi alla volta.

Come posso eliminare più di 50 nodi alla volta?


Esisteva un modulo di "eliminazione di massa", ma era diventato obsoleto a favore di VBO. Ma VBO sembra supportare l'elaborazione batch. Hai provato ad usarlo?
Mołot,

1
VBO, come indicato nelle risposte di seguito, è probabilmente la strada da percorrere. Ciò che ho fatto a volte per eliminare una grandezza in più di nodi rispetto a questo caso, è il modulo di hacking che invoca per ignorare molte invocazioni di hook che non mi servono. (Il mio peggior colpevole è stato Apache Solr). Questo può accelerare significativamente il lavoro, ma ovviamente deve essere fatto con grande cura.
Letharion,

Risposte:


16

VBO è lo standard di fatto per l'eliminazione di massa di nodi, semplicemente non esiste un modo migliore per farlo.

Poiché VBO viene elaborato in batch, esegue solo 1 (o forse un paio) di nodi alla volta. Pertanto, se si ricevono errori di timeout, questi sono correlati all'eliminazione di un singolo nodo, non all'intera operazione batch.

La risoluzione standard a qualcosa del genere è di aumentare il tempo massimo di esecuzione di PHP per compensare.


2
Solo per completare la risposta: puoi scegliere quante entità devono essere raccolte per l'operazione. Usando 100 andrà bene in ~ 1 minuto dalla mia esperienza.
AyeshK,

7

Installa Develop. Quindi vai su admin / config / development / generate / content in D7 e seleziona tutto il tipo di contenuto. Seleziona "Elimina tutto il contenuto". Inserisci 0 in "Quanti nodi desideri generare?"

Fai clic su Genera.

Questo eliminerà tutti i nodi.


1
@ Mołot ' Seleziona "Elimina tutto il contenuto" ' ... 'Inserisci 0 in "Quanti nodi desideri generare?"' ...;)
Clive

@Clive OK, errore mio, scusa.
Mołot,

1
In particolare, è il modulo Devel Generate che lo fa; viene fornito con Devel, ma non otterrai questa funzionalità se attivi solo Devel. Puoi anche eliminare facilmente tutti i nodi di un determinato tipo di contenuto in questo modo, se non vuoi eliminare tutto. Se stai ancora ottenendo timeout PHP e non hai paura della CLI, puoi anche usare il comando Drush generate-content( genc) fornito con Devel Generate; drush help gencper informazioni sull'utilizzo.
Garrett Albright,

3

Usa un VBO ed eseguilo da Drush. Ho usato il seguente metodo per eliminare oltre 1,5 milioni di nodi dopo il test della scala.

  1. Crea una nuova vista con una pagina. Impostare i filtri in modo appropriato per visualizzare solo il tipo di nodi che si desidera eliminare.
  2. Aggiungi un nuovo campo: "Operazioni collettive: contenuto"
  3. Seleziona la casella accanto a "Elimina elemento" in "Operazioni in blocco selezionate".
  4. Salva la vista.
  5. Supponendo che tu sappia come usare Drush, esegui questo comando: (Usa uno 'schermo' di Linux per eseguire ininterrottamente per grandi set di dati)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Dove, my_view è il nome della macchina della tua vista

Puoi anche usare drush vbo-list per visualizzare tutte le viste disponibili e le loro operazioni in blocco .

Il VBO ora dovrebbe funzionare nella shell, dandoti feedback mentre procede.


2

C'è un modulo Elimina tutto là fuori. Eliminerà tutti i nodi e / o gli utenti dal sito.

Ha anche il supporto Drush:

Esempi:

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
Consiglio vivamente di non utilizzare questo modulo: imposta un limite di tempo di 30 secondi sullo script e scorre ogni singolo nodo singolarmente , chiamando node_delete()(non si preoccupa nemmeno di usarlo node_delete_multiple()). Ancora più preoccupante, ha un'opzione che cancella i dati direttamente dalle tabelle del database senza usare l'API di campo e senza usare gli hook. Nessun lavoro batch, funziona solo fino alla morte dello script. Modulo IMHO molto pericoloso.
Clive

2
Potrebbe essere comunque utile se sai cosa stai facendo e fai dei backup. L'eliminazione di migliaia di nodi durante il richiamo di tutti gli hook e le api può essere dolorosamente lento. :(
Letharion,

@Letharion Nessun dolore, nessun guadagno;) Hai ragione ovviamente, anche se farei meglio a dare uno schiaffo su questo dato che questo modulo potrebbe rendere le cose disordinate se nelle mani sbagliate!
Clive

@Clive Con il supporto di Drush se dovessi fare drush delete-all articleper eliminare articoli, sceglierei questa soluzione.
AjitS

@develkar Per alcune centinaia di nodi che potrebbero andare bene, ma l'estensione drush utilizza esattamente le stesse funzioni della versione in loco, quindi sfortunatamente è altrettanto sensibile ai timeout
Clive


0

Per cancellare nodi in gran numero (cioè è bulk) come nel tuo caso, puoi anche usare il modulo di eliminazione in blocco per questo.

Questo utilizzerà l'API Batch per eliminare i nodi per evitare problemi di timeout o di memoria quando si eliminano migliaia di nodi con una singola chiamata a node_delete_multiple ().

A parte questo, puoi anche provare a eliminare tutto il modulo per eliminare tutti i nodi di un tipo di contenuto.

Spero che sia di aiuto.


0

Puoi anche creare un processo batch per esso usando l'API BATCH e in quel processo batch basta farlo

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

Questo è tutto. Hai finito qui. Se desideri creare un comando drush per esso, puoi anche crearlo. Per riferimento, guarda questo .


0

Se hai motivo di farlo con il codice:

$query = new EntityFieldQuery();

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

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

Hai anche molti altri metodi disponibili per selezionare i nodi da eliminare.


0

Puoi seguire il consiglio di Bobik e dargli da mangiare come argomento di un 'drush php-eval' se sei davvero in difficoltà, ma mi aspetterei che le prestazioni saranno simili a quelle del VBO, pur essendo leggermente più veloci. Se le prestazioni sono molto lente, potresti voler dare un'occhiata a quali moduli chiamano hook_node_delete grepping la base di codice per '_node_delete (' e quindi determinare se puoi disabilitare o meno alcuni dei moduli che stanno usando quel hook.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.