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?
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?
Risposte:
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.
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.
generate-content
( genc
) fornito con Devel Generate; drush help genc
per informazioni sull'utilizzo.
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.
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.
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.
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.
drush delete-all article
per eliminare articoli, sceglierei questa soluzione.
Utilizza le operazioni in blocco di Views: è stata una buona idea. Ma invece di chiamare direttamente l'operazione, usa l'API batch. Qui puoi leggere l'articolo shor a riguardo. La mancanza di documentazione su quella parte era un problema noto .
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.
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 .
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.
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.