Supprimer 13 000 nœuds


9

J'ai environ 13 000 nœuds à supprimer dans un site Drupal 7. J'ai essayé le module Views Bulk Operations pour supprimer 500 nœuds à la fois, mais il arrive à expiration. Je ne peux supprimer que 50 nœuds à la fois.

Comment puis-je supprimer plus de 50 nœuds à la fois?


Il y avait un module de "suppression en bloc", mais est devenu obsolète en faveur de VBO. Mais VBO semble prendre en charge le traitement par lots. Avez-vous essayé de l'utiliser?
Mołot

1
Le VBO, comme indiqué dans les réponses ci-dessous, est probablement la voie à suivre. Ce que j'ai fait à certains moments où je devais supprimer plus de nœuds que dans ce cas, c'est invoquer le module de piratage pour ignorer de nombreuses invocations de hooks dont je n'ai pas besoin. (Mon pire délinquant était apache solr). Cela peut accélérer considérablement le travail, mais doit évidemment être fait avec beaucoup de soin.
Letharion

Réponses:


16

VBO est la norme de facto pour les nœuds de suppression en masse, il n'y a tout simplement pas de meilleure façon de le faire.

Comme VBO traite en lots, il ne fait que 1 (ou peut-être quelques) nœuds à la fois. Donc, si vous recevez des erreurs de dépassement de délai, celles-ci sont liées à la suppression d'un seul nœud, et non à l'ensemble de l'opération par lots.

La résolution standard de quelque chose comme ça est d' augmenter le temps d'exécution max PHP pour compenser.


2
Juste pour compléter la réponse: vous pouvez choisir combien d'entités doivent être récupérées pour l'opération. Utiliser 100 fera l'affaire en ~ 1 minute de mon expérience.
AyeshK

7

Installez Devel. Ensuite, allez dans admin / config / development / generate / content dans D7 et sélectionnez tous les types de contenu. Cochez "Supprimer tout le contenu". Entrez 0 dans "Combien de nœuds souhaitez-vous générer?"

Cliquez sur Générer.

Cela supprimera tous les nœuds.


1
@ Mołot ' Cochez "Supprimer tout le contenu" ' ... 'Entrez 0 dans "Combien de nœuds souhaitez-vous générer?"' ...;)
Clive

@Clive OK, mon erreur, désolé.
Mołot

1
Plus précisément, c'est le module Devel Generate qui le fait; il est livré avec Devel, mais vous n'obtiendrez pas cette fonctionnalité si vous activez simplement Devel. Vous pouvez également supprimer facilement tous les nœuds d'un certain type de contenu de cette façon, si vous ne souhaitez pas tout supprimer. Si vous obtenez toujours des délais d'expiration PHP et que vous n'avez pas peur de la CLI, vous pouvez également utiliser la commande Drush generate-content( genc) fournie avec Devel Generate; drush help gencpour des informations d'utilisation.
Garrett Albright

3

Utilisez un VBO et exécutez-le depuis Drush. J'ai utilisé la méthode suivante pour supprimer plus de 1,5 million de nœuds après les tests d'échelle.

  1. Créez une nouvelle vue avec une page. Définissez les filtres de manière appropriée pour afficher uniquement le type de nœuds que vous souhaitez supprimer.
  2. Ajoutez un nouveau champ: "Opérations en bloc: Contenu"
  3. Cochez la case à côté de "Supprimer l'élément" sous "Opérations en bloc sélectionnées".
  4. Enregistrez la vue.
  5. En supposant que vous savez utiliser Drush, exécutez cette commande: (Utilisez un «écran» linux pour fonctionner sans interruption pour les grands ensembles de données)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Où, my_view est le nom de la machine de votre vue

Vous pouvez également utiliser drush vbo-list pour afficher toutes les vues disponibles et leurs opérations en bloc.

Le VBO devrait maintenant fonctionner dans le shell, vous donnant des commentaires au fur et à mesure.


2

Il existe un module Supprimer tout . Il supprimera tous les nœuds et / ou utilisateurs du site.

Il prend également en charge Drush:

Exemples:

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
Je recommande fortement de ne pas utiliser ce module - il définit une limite de temps de 30 secondes sur le script et traverse chaque nœud individuellement , appelant node_delete()(il ne prend même pas la peine d'être utilisé node_delete_multiple()). Plus inquiétant encore, il dispose d'une option qui supprime les données directement des tables de base de données sans utiliser l'API de champ et sans utiliser de hooks. Aucun travail par lots, il s'exécute jusqu'à la fin du script. Module très dangereux à mon humble avis.
Clive

2
Cela pourrait toujours être utile si vous savez ce que vous faites et effectuez des sauvegardes. La suppression de milliers de nœuds tout en invoquant tous les crochets et les API peut être douloureusement lente. :(
Letharion

@Letharion Aucune douleur, aucun gain;) Vous avez bien sûr raison, je pensais que je ferais mieux de gifler un avertissement à ce sujet car ce module pourrait rendre les choses désordonnées s'il est entre de mauvaises mains!
Clive

@Clive Avec un support drush si je dois faire drush delete-all articlepour supprimer des articles, j'opterais pour cette solution.
AjitS

@develkar Pour quelques centaines de nœuds, cela pourrait être bien, mais l'extension drush utilise exactement les mêmes fonctions que la version sur site, elle est donc toujours aussi sensible aux délais d'attente malheureusement
Clive


0

Pour supprimer des nœuds en grand nombre (c'est-à-dire en vrac) comme dans votre cas, vous pouvez également utiliser le module de suppression en bloc pour cela.

Cela utilisera l'API Batch pour supprimer les nœuds afin d'éviter les problèmes de dépassement de délai ou de mémoire lors de la suppression de milliers de nœuds avec un seul appel à node_delete_multiple ().

En dehors de cela, vous pouvez même essayer Supprimer tout le module pour supprimer tous les nœuds d'un type de contenu.

J'espère que cela t'aides.


0

Vous pouvez également créer un processus par lots à l'aide de l'API BATCH et dans ce processus par lots, faites simplement

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

C'est ça. Vous avez terminé ici. Si vous souhaitez lui créer une commande drush, vous pouvez également la créer. Pour référence, veuillez regarder ceci .


0

Si vous avez des raisons de le faire par code:

$query = new EntityFieldQuery();

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

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

Vous avez également de nombreuses autres méthodes disponibles pour sélectionner les nœuds à supprimer.


0

Vous pouvez suivre les conseils de Bobik et nourrir cela comme l'argument d'un `` phush-eval drush '' si vous êtes vraiment dans un pincement, mais je m'attends à ce que les performances soient similaires à celles du VBO, tout en étant légèrement plus rapides. Si les performances sont vraiment lentes, vous souhaiterez peut-être voir quels modules appellent hook_node_delete en saluant la base de code pour '_node_delete (' et en déterminant ensuite si vous pouvez désactiver certains des modules qui utilisent ce hook.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.