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.
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.
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?"
@ 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.
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.
Adicione um novo campo: "Operações em massa: Conteúdo"
Marque a caixa ao lado de "Excluir item" em 'Operações em massa selecionadas'.
Salve a vista.
Supondo que você saiba como usar o Drush, execute este comando: (Use uma 'tela' do linux para executar ininterruptamente para grandes conjuntos de dados)
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.
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
Use as operações em massa do Views - foi uma boa ideia. Mas, em vez de chamar a operação diretamente, use a API do lote. Aqui você pode ler um artigo sobre isso. A falta de documentação nessa parte era um problema conhecido .
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.
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).
Respostas:
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.
fonte
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.
fonte
generate-content
(genc
) que acompanha o Devel Generate;drush help genc
para informações de uso.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.
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.
fonte
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:
fonte
node_delete()
(ele nem se incomoda em usarnode_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.drush delete-all article
excluir artigos, eu usaria esta solução.Use as operações em massa do Views - foi uma boa ideia. Mas, em vez de chamar a operação diretamente, use a API do lote. Aqui você pode ler um artigo sobre isso. A falta de documentação nessa parte era um problema conhecido .
fonte
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.
fonte
Você também pode criar um processo em lote para ele usando a API BATCH e, nesse processo em lote, basta
É isso aí. Você terminou aqui. Se você deseja criar um comando drush para ele, também pode criá-lo. Para referência, veja isso .
fonte
Se você tiver motivos para fazê-lo por código:
Você também tem muitos outros métodos disponíveis para selecionar nós a serem excluídos.
fonte
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).
fonte