Eliminar 13000 nodos

9

Tengo unos 13000 nodos para eliminar en un sitio de Drupal 7. He intentado con el módulo Views Bulk Operations para eliminar 500 nodos a la vez, pero se agota el tiempo de espera. Solo puedo eliminar 50 nodos a la vez.

¿Cómo puedo eliminar más de 50 nodos a la vez?

chaithanya
fuente
Solía ​​haber un módulo de "eliminación masiva", pero quedó obsoleto a favor de VBO anwyay. Pero VBO parece admitir el procesamiento por lotes. ¿Has intentado usarlo?
Mołot
1
VBO, como se indica en las respuestas a continuación, es probablemente el camino a seguir. Lo que he hecho en momentos en que necesito eliminar una cantidad mayor de nodos que en este caso, es invocar un módulo de hackeo para ignorar muchas invocaciones de ganchos que no necesito. (Mi peor delincuente fue Apache Solr). Esto puede acelerar significativamente el trabajo, pero obviamente debe hacerse con mucho cuidado.
Letharion

Respuestas:

16

VBO es el estándar de facto para nodos de eliminación masiva, simplemente no hay una mejor manera de hacerlo.

A medida que VBO procesa en lotes, solo hace 1 (o tal vez un par) de nodos a la vez. Entonces, si está recibiendo errores de tiempo de espera, estos están relacionados con la eliminación de un solo nodo, no con la operación por lotes completa.

La resolución estándar para algo como esto es aumentar el tiempo máximo de ejecución PHP para compensar.

Clive
fuente
2
Solo para completar la respuesta: puede elegir cuántas entidades se deben recoger para la operación. Usar 100 funcionará bien en ~ 1 minuto desde mi experiencia.
AyeshK
7

Instalar Devel. Luego vaya a admin / config / development / generate / content en D7 y seleccione todo tipo de contenido. Marque "Eliminar todo el contenido". Ingrese 0 en "¿Cuántos nodos le gustaría generar?"

Haz clic en Generar.

Eso eliminará todos los nodos.

AgA
fuente
1
@ Mołot ' Marque "Eliminar todo el contenido" ' ... 'Ingrese 0 en "¿Cuántos nodos le gustaría generar?"' ...;)
Clive
@Clive OK, mi error, lo siento.
Mołot
1
Específicamente, es el módulo Devel Generate que hace esto; se envía con Devel, pero no obtendrá esta funcionalidad si solo habilita Devel. También puede eliminar fácilmente todos los nodos de un determinado tipo de contenido de esta manera, si no desea eliminar todo. Si todavía obtiene tiempos de espera de PHP y no le teme a la CLI, también puede usar el comando Drush generate-content( genc) que viene con Devel Generate; drush help gencpara información de uso.
Garrett Albright
3

Use un VBO y ejecútelo desde Drush. Utilicé el siguiente método para eliminar más de 1.5 millones de nodos después de las pruebas de escala.

  1. Crea una nueva vista con una página. Configure los filtros adecuadamente para mostrar solo el tipo de nodos que desea eliminar.
  2. Agregar un nuevo campo: "Operaciones masivas: contenido"
  3. Marque la casilla junto a "Eliminar elemento" en 'Operaciones masivas seleccionadas'.
  4. Guarda la vista.
  5. Suponiendo que sabe cómo usar Drush, ejecute este comando: (Use una 'pantalla' de Linux para ejecutar sin interrupciones para grandes conjuntos de datos)

drush vbo-execute my_view action :: views_bulk_operations_delete_item

Dónde, my_view es el nombre de la máquina de su vista

También puedes usar drush vbo-list para mostrar todas las vistas disponibles y sus operaciones masivas.

El VBO ahora debería ejecutarse en el shell, proporcionándole comentarios sobre la marcha.

davewilly
fuente
2

Hay un módulo Eliminar todo por ahí. Eliminará todos los nodos y / o usuarios del sitio.

También tiene soporte Drush:

Ejemplos:

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
fuente
77
Recomiendo encarecidamente no usar este módulo: establece un límite de tiempo de 30 segundos en el script y se ejecuta a través de cada nodo individualmente , llamando node_delete()(ni siquiera se molesta en usarlo node_delete_multiple()). Aún más preocupante, tiene una opción que elimina datos directamente de las tablas de la base de datos sin usar la API de campo y sin usar ganchos. No hay trabajos por lotes en absoluto, solo se ejecuta hasta que el script muere. Módulo muy peligroso en mi humilde opinión.
Clive
2
Todavía podría ser útil si sabe lo que está haciendo y realiza copias de seguridad. Eliminar miles de nodos al invocar todos los ganchos y apis puede ser muy lento. :(
Letharion
@Letharion Sin dolor, sin ganancia;) Tienes razón, por supuesto, ¡aunque creo que sería mejor darle una advertencia a esto ya que este módulo podría hacer que las cosas se vuelvan desordenadas si está en las manos equivocadas!
Clive
@Clive Con soporte drush si tengo que hacer drush delete-all articlepara eliminar artículos, iría por esta solución.
AjitS
@develkar Para unos cientos de nodos que podrían estar bien, pero la extensión drush usa exactamente las mismas funciones que la versión en el sitio, por lo que desafortunadamente todavía es tan susceptible a los tiempos de espera
Clive
0

Para eliminar nodos en gran número (es decir, en masa) como en su caso, también puede usar el módulo de eliminación masiva para esto.

Eso utilizará la API de Batch para eliminar los nodos para evitar problemas de tiempo de espera o memoria al eliminar miles de nodos con una sola llamada a node_delete_multiple ().

Aparte de esto, incluso puede intentar Eliminar todo el módulo para eliminar todos los nodos de un tipo de contenido.

Espero que esto ayude.

neetu morwani
fuente
0

También puede crear un proceso por lotes para él utilizando BATCH API y en ese proceso por lotes simplemente haga

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

Eso es. Ya terminaste aquí. Si desea crear un comando drush para él, también puede crearlo. Como referencia, mira esto .

Deepak Kumar
fuente
0

Si tiene razones para hacerlo por código:

$query = new EntityFieldQuery();

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

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

También tiene muchos otros métodos disponibles para seleccionar nodos para eliminar.

Bobík
fuente
0

Puede tomar el consejo de Bobik y alimentarlo como el argumento de un 'drush php-eval' si realmente está en apuros, pero esperaría que el rendimiento sea similar al de VBO, aunque sea un poco más rápido. Si el rendimiento es realmente lento, es posible que desee ver qué módulos están llamando a hook_node_delete agrupando la base de código para '_node_delete (' y luego determinando si puede o no desactivar algunos de los módulos que están usando ese gancho.

Emmanuel Buckshi
fuente