Excluir milhares de tarefas cron


16

Descobri que tenho 29.000 trabalhos cron em meu banco de dados WordPress a partir de plugins desativados e excluídos. Eu tentei vários plugins otimizadores, mas o grande número de trabalhos cron significa que não posso excluí-los usando plugins.

Eu também tentei isso no meu functions.php sem sucesso:

add_action("init", "clear_crons_left");
function clear_crons_left() {
    wp_clear_scheduled_hook("cron_name");
}

Existe algum comando SQL que eu possa usar no phpmyadmin para pesquisar pelo cron hook e removê-los?


Eu encontrei WP massa excluir, uso com cuidado e colocar um máximo de itens para apagar de uma só vez
Zwelly

Respostas:


18

Obrigado Privateer pela pronta resposta e conselhos.

Eu encontrei uma maneira de contornar isso antes de ver sua resposta. Aqui está um método passo a passo para excluir milhares de tarefas cron antigas e pode ser útil para outra pessoa.

Eu entrei no phpMyAdmin. Eu cliquei no meu banco de dados e depois na guia 'pesquisa'. Digitei 'cron', selecionei 'all tables' e cliquei em 'Go'. Rolei a lista de resultados da pesquisa para a minha tabela wp_options. Eu cliquei em 'Procurar'. No topo da lista estava option_name 'cron'. Cliquei em "Editar" e aguardei o carregamento da página. Cliquei na caixa que mostrava a lista de tarefas cron. A lista cron era tão longa que demorou cerca de 80 segundos para o meu cursor responder. Eu então usei Ctrl-A no teclado para selecionar tudo antes de pressionar o botão excluir. Demorou cerca de 2 minutos para o meu navegador concluir a exclusão (o tempo limite do chrome expirou, então tentei o Firefox, que funcionava).

Depois de alguns minutos, os trabalhos do cron para meus plug-ins ativos atuais preencheram novamente a lista. Havia 9 trabalhos cron (abaixo dos 29.000!). Seis anos de trabalhos cron duplicados a partir de plugins mal codificados, alguns dos quais eu instalei por um dia para experimentar. Também centenas de plugins comuns, como Wordfence, BackupBuddy, Nextgen Gallery e AutoOptimizer - todos os quais eu havia desinstalado no passado. Meu site agora carrega como se tivesse sido carregado com turbo. A área administrativa é muito mais rápida. Os erros de tempo limite do administrador desapareceram. Eu gastei muito tempo otimizando meu site tentando diminuir o tempo de carregamento. Eu até mudei hosts e atualizei meus planos de hospedagem. Nada aumentou a velocidade do meu site como excluir todos os trabalhos cron desatualizados. O tempo de download em dispositivos móveis diminuiu de 20 segundos para 6 segundos.

Na minha busca por uma solução, encontrei muito poucas informações sobre o efeito dos trabalhos do cron no desempenho do site. Muitos disseram que isso fez pouca diferença e, para um pequeno número de trabalhos cron, isso é verdade. Mas, anos após a vida de um site WordPress, pergunto-me quantos estão inchados com centenas, senão milhares, de trabalhos cron antigos de plug-ins excluídos. Em vez de pedir aos usuários que verifiquem seu limite de memória php, sugiro que os desenvolvedores primeiro solicitem aos usuários que verifiquem o número de trabalhos cron em wp_options ao solucionar problemas fatais de memória. Você pode ficar surpreso / chocado com o que encontra! :-)


1
Eu encontrei o mesmo problema. Agora, não sei quantos trabalhos cron eu tinha, mas ele tinha cerca de 15 Mb no banco de dados. Após a exclusão, o tempo de carregamento da área de administração diminuiu de 5 a 7 para 0,3 segundos. O tempo de carregamento do front-end diminuiu de 2 para 0,4 seg.
Alexey5 /

1
droga! Esta solução nos salvou! teve 35000 trabalhos cron nesta tabela. agora parece turbo como descrito.
Riccardo

Muito bom saber, pois estava pensando em instalar um dos plugins mencionados para um cliente. Então agora eu sei o que procurar quando o desempenho se deteriora lentamente.
lowtechsun

10

Experimentar

SELECT * FROM `wp_options` WHERE option_name = 'cron'

Se você o encontrar, tente:

  • No SQL: UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'
  • No wordpress: update_option('cron', '');

Pode ser necessário excluir a opção cron ou configurar o valor para uma matriz serializada vazia.

Usar update_option seria mais seguro, pois não tenho certeza se o valor deve ser uma matriz vazia serializada ou uma string vazia. Você pode verificar o arquivo wp-includes / options.php ... mas usar o update_option irá lidar com isso corretamente sem se preocupar com o banco de dados.


7

Os eventos cron do Wordpress também podem ser limpos na linha de comando, usando o WP-CLI :

wp cron event list
wp cron event delete your_example_event

Mais detalhes nos documentos wp-cli .


3
Ou exclua todos os eventoswp option delete cron
Samuel Elh 19/04/19

1
wp option delete cronfunciona quando existem milhares de trabalhos cron preenchidos nas opções. Esses trabalhos ruins vêm principalmente de plugins ruins, fazendo o cron da maneira errada.
Swashata Ghosh 06/04/19

6

Uma solução ainda mais simples é chamar delete_option( 'cron' );uma vez em algum plugin. Todos os trabalhos cron adicionados automaticamente serão adicionados novamente na próxima visita / solicitação do seu site.

Como um plug-in de um caso (mu), que é executado apenas quando você o ativa:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );

Obrigado Kaiser! Para aqueles que não estão familiarizados com a criação / edição de plugins (é simples!), Você pode usar o que o kaiser anotou no seu arquivo functions.php. Basta adicioná-lo, salvá-lo, carregar seu site, removê-lo e salvá-lo novamente.
Corsário 10/10

E os trabalhos cron criados na ativação do plug-in? Esses trabalhos cron não seriam recriados até que você desative e reative o plug-in.
31 de

Bem, isso não é possível por padrão , nem com isso nem com as outras perguntas. O que você teria que fazer é des- e reativar esses plug-ins (~ 3 minutos de trabalho) ou - caso esteja procurando uma resposta automatizada - pesquise as funções nesses plug-ins e as ative no seu plug-in.
kaiser

1

Caso alguém queira limpar um nome cron específico (por exemplo, 'CRON_NAME'), esta solução funcionou para mim:

    $crons = _get_cron_array();
    //echo "Found total ".count($crons)."<br />";
    //Keep only the ones that don't match the cron name
    $updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
    //echo "Reduced to ".count($updated)."<br />";        
    _set_cron_array($updated);

1

Eu tive um ano cheio de trabalhos cron pendentes, cerca de 5 Mb de dados para essa entrada única no banco de dados. Excluídos os trabalhos cron do banco de dados. Tarefas cron desabilitadas em wp-config.php

Configure um trabalho cron manual no cpanel. Agora meu site está literalmente voando. Eu estava atualizando servidores, comprando mais CPU / RAM, mas tudo era um desperdício de dinheiro e tempo.

Para excluir todos os trabalhos cron pendentes, execute esta consulta em phpmyadmin> Executar consulta:

UPDATE wp_options SET option_value = '' WHERE option_name = 'cron'

Muito obrigado Pádraig Ó Beirn.


De nada Preetinder! Estou feliz que tenha sido de ajuda. Obrigado pela dica sobre os trabalhos cron pendentes também.
Pádraig Ó Beirn

0

Se você limpar as tarefas do cron dessa maneira e usar o UpdraftPlus, precisará salvar novamente suas configurações para gerar novamente as tarefas do cron. Até você fazer isso, seus backups automatizados não serão executados (mas os backups manuais).

As configurações ainda estarão lá e você não precisará editar nada. Basta ir ao [menu superior do UpdraftPlus] -> Configurações, e role para baixo até a parte inferior e clique em "Salvar alterações".


0

Cheguei aqui por causa da enorme quantidade de sm_pingcronjobs wp_options. Se esse for o seu problema, você pode tentar o seguinte:

Coloque isso em functions.php (tema filho) se você não tiver acesso ao phpmyadmin, especialmente se o seu site estiver cheio de ping cronjobs (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}

0

Corri para um problema semelhante, onde, devido a um dos meus próprios erros de codificação, milhares de cópias de um determinado trabalho cron foram adicionadas a um site. A função wp_clear_scheduled_hook parecia expirar e falhar. Eu contornei com um script que desmarcou todas as instâncias da função cron dentro da matriz e, em seguida, adiciona a matriz filtrada como a nova opção cron na tabela de opções. Ver abaixo.

Dessa maneira, evitei desfazer os trabalhos cron desejáveis ​​adicionados anteriormente ao site.

Isso pode ser modificado como uma função que leva uma matriz de identificadores para eliminar ou uma matriz de identificadores a ser preservada.

$crons = _get_cron_array();
    $hook = 'tj_flush_w3tc_cache';
    foreach ( $crons as $timestamp => $cron ) {
    if ( isset( $cron[ $hook ] ) ) {
        unset($cron[$hook]);
    }
    if(!empty($cron))
        $newcron[$timestamp] = $cron;       
    }
    update_option('cron',$newcron);

0

Eu tenho uma maneira muito simples de excluir todos os eventos cron. Antes, era necessário DESATIVAR o WP Cron no wp-config. Depois, instale o Controle WP do plug-in. Em seguida, vá para o menu Ferramenta> Eventos do cron> Clique em escolheu todos> Excluir todos eles. Você poderia tentar? Obrigado.

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.