Excluir 13000 nós


9

Eu tenho cerca de 13000 nós para excluir em um site Drupal 7. Tentei o módulo Views Bulk Operations para excluir 500 nós de cada vez, mas o tempo limite se esgotou. Só posso excluir 50 nós por vez.

Como posso excluir mais de 50 nós por vez?


Costumava haver módulo "exclusão em massa", mas ficou obsoleto em favor do VBO anwyay. Mas o VBO parece suportar o processamento em lote. Você já tentou usá-lo?
Mołot

11
O VBO, como indicado nas respostas abaixo, é provavelmente o caminho a percorrer. O que eu fiz às vezes precisando excluir uma magnitude mais nós do que neste caso, é a chamada de módulo de hackers para ignorar muitas invocações de ganchos que eu não preciso. (Meu pior agressor foi apache solr). Isso pode acelerar significativamente o trabalho, mas obviamente deve ser feito com muito cuidado.
Letharion

Respostas:


16

VBO é o padrão de fato para nós de exclusão em massa, simplesmente não há uma maneira melhor de fazê-lo.

Como o VBO processa em lotes, ele faz apenas 1 (ou talvez alguns) nós de cada vez. Portanto, se você estiver recebendo erros de tempo limite, estão relacionados à exclusão de um único nó, não a toda a operação em lote.

A resolução padrão para algo assim é aumentar o tempo máximo de execução do PHP para compensar.


2
Apenas para completar a resposta: Você pode escolher quantas entidades devem ser selecionadas para a operação. Usar 100 fará muito bem em ~ 1 minuto da minha experiência.
AyeshK

7

Instale o Devel. Em seguida, vá para admin / config / development / generate / content no D7 e selecione todo o tipo de conteúdo. Marque "Excluir todo o conteúdo". Digite 0 em "Quantos nós você gostaria de gerar?"

Clique em gerar.

Isso excluirá todos os nós.


11
@ Mołot ' Marque "Excluir Todo o Conteúdo" ' ... 'Digite 0 em "Quantos nós você gostaria de gerar?"' ...;)
Clive

@ Clive OK, meu erro, desculpe.
Mołot

11
Especificamente, é o módulo Devel Generate que faz isso; ele é fornecido com o Devel, mas você não obterá essa funcionalidade se apenas ativar o Devel. Você também pode excluir facilmente todos os nós de um determinado tipo de conteúdo dessa maneira, se não quiser excluir tudo. Se você ainda está recebendo tempos limite do PHP e não tem medo da CLI, também pode usar o comando Drush generate-content( genc) que acompanha o Devel Generate; drush help gencpara informações de uso.
Garrett Albright

3

Use um VBO e execute-o no Drush. Usei o método a seguir para excluir mais de 1,5 milhões de nós após o teste de escala.

  1. Crie uma nova exibição com uma página. Defina os filtros adequadamente para exibir apenas o tipo de nós que você deseja excluir.
  2. Adicione um novo campo: "Operações em massa: Conteúdo"
  3. Marque a caixa ao lado de "Excluir item" em 'Operações em massa selecionadas'.
  4. Salve a vista.
  5. Supondo que você saiba como usar o Drush, execute este comando: (Use uma 'tela' do linux para executar ininterruptamente para grandes conjuntos de dados)

Drush vbo-executar my_view ação :: views_bulk_operations_delete_item

Onde, my_view é o nome da máquina da sua visualização

Você também pode usar drush vbo-list para exibir todas as visualizações disponíveis e suas operações em massa.

O VBO agora deve ser executado no shell, fornecendo feedback à medida que for sendo executado.


2

Existe um módulo Excluir tudo por aí. Ele excluirá todos os nós e / ou usuários do site.

Ele também tem suporte ao Drush:

Exemplos:

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
Eu recomendo fortemente não usar este módulo - ele define um limite de tempo de 30 segundos no script e percorre todos os nós individualmente , chamando node_delete()(ele nem se incomoda em usar node_delete_multiple()). Ainda mais preocupante, ele possui uma opção que exclui dados diretamente das tabelas do banco de dados sem usar a API do campo e sem usar ganchos. Nenhum trabalho em lote, ele é executado até o script morrer. Módulo muito perigoso IMHO.
Clive

2
Ainda pode ser útil se você souber o que está fazendo e fazer backups. Excluir milhares de nós enquanto invoca todos os ganchos e apis pode ser extremamente lento. :(
Letharion

@Letharion Sem dor, sem ganho;) Você está certo, é claro, é melhor eu dar um tapa nesse aviso, pois este módulo pode deixar as coisas confusas se estiver nas mãos erradas!
Clive

@Clive Com suporte a drush, se eu puder drush delete-all articleexcluir artigos, eu usaria esta solução.
AjitS

@develkar Para algumas centenas de nós, isso pode ser bom, mas a extensão drush usa exatamente as mesmas funções da versão on-site, por isso ainda é suscetível a tempos limites, infelizmente
Clive


0

Para excluir nós em número grande (ou seja, em massa), como no seu caso, você também pode usar o módulo de exclusão em massa para isso.

Isso usará a API do Lote para excluir os nós para evitar problemas de tempo limite ou memória ao excluir milhares de nós com uma única chamada para node_delete_multiple ().

Além disso, você pode até tentar Excluir todos os módulos para excluir todos os nós de um tipo de conteúdo.

Espero que isto ajude.


0

Você também pode criar um processo em lote para ele usando a API BATCH e, nesse processo em lote, basta

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

É isso aí. Você terminou aqui. Se você deseja criar um comando drush para ele, também pode criá-lo. Para referência, veja isso .


0

Se você tiver motivos para fazê-lo 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']));

Você também tem muitos outros métodos disponíveis para selecionar nós a serem excluídos.


0

Você pode seguir o conselho de Bobik e alimentá-lo como o argumento de um 'drush php-eval' se você estiver realmente preocupado, mas eu esperaria que o desempenho seja semelhante ao da VBO, embora seja um pouco mais rápido. Se o desempenho for realmente lento, convém dar uma olhada no que os módulos estão chamando hook_node_delete, cumprimentando a base de código para '_node_delete (' e determinando se você pode ou não desabilitar alguns dos módulos que estão usando esse gancho).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.