Exclua milhares de tarefas do cron

14

Descobri que tenho 29.000 cron jobs no meu banco de dados WordPress de plug-ins desativados e excluídos. Eu tentei vários plug-ins otimizadores, mas o grande número de tarefas cron significa que não posso excluí-los usando plug-ins.

Eu também tentei isso em my 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 procurar pelo cron hook e removê-los?

    
por Pádraig Ó Beirn 24.01.2015 / 19:48

9 respostas

18

Obrigado a Privateer pela resposta imediata e conselhos.

Encontrei uma maneira de contornar isso antes de ver sua resposta. Aqui está um método passo-a-passo para apagar milhares de trabalhos cron antigos e pode ser útil para outra pessoa.

Eu entrei no phpMyAdmin. Eu cliquei no meu banco de dados e, em seguida, na guia "pesquisa". Eu digitei 'cron' e então selecionei 'all tables' e cliquei em 'Go'. Eu rolei a lista de resultados da pesquisa para a minha tabela wp_options. Eu cliquei em 'Browse'. No topo da lista estava option_name 'cron'. Eu cliquei em 'Editar' e esperei a página carregar. Cliquei na caixa que mostrava a lista de tarefas agendadas. A lista cron foi 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 apertar o botão delete. Demorou cerca de 2 minutos até que o meu navegador completasse a eliminação (chrome timed-out, por isso tentei o Firefox que funcionou).

Após alguns minutos, os trabalhos agendados dos meus plug-ins ativos atuais preencheram a lista novamente. Houve 9 trabalhos cron (abaixo de mais de 29.000!). Seis anos de trabalhos cron duplicados de plugins mal codificados, alguns dos quais acabei de instalar por um dia para experimentar. Também centenas de plugins comuns, como Wordfence, BackupBuddy, Nextgen Gallery e AutoOptimizer - todos os quais eu tinha desinstalado no passado. Meu site agora carrega como se fosse um turbo. A área de administração é muito mais rápida. Os erros de tempo limite do administrador desapareceram. Eu passei muito tempo otimizando meu site tentando diminuir o tempo de carregamento. Até movi os hosts e atualizei meus planos de hospedagem. Nada aumentou a velocidade do meu site, como excluir todos os trabalhos do cron desatualizados. O tempo de download para dispositivos móveis diminuiu de 20 segundos para 6 segundos. O tempo de download do desktop diminuiu de cerca de 12 a 4 segundos.

Na minha busca por uma solução, encontrei muito pouca informação sobre o efeito das tarefas do cron no desempenho do site. Muitos disseram que fazia pouca diferença e, para um pequeno número de tarefas cron, é verdade. Mas anos na vida de um site WordPress eu me pergunto quantos estão inchados com centenas, senão milhares de antigos trabalhos cron de plugins excluídos. Em vez de pedir aos usuários que verifiquem o limite de memória do php, sugiro que os desenvolvedores peçam aos usuários que verifiquem o número de tarefas agendadas no wp_options ao solucionar erros fatais de memória. Você pode se surpreender / chocado com o que encontra! :-)

    
por Pádraig Ó Beirn 31.01.2015 / 17:29
10

Tente

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

Se você 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 definir 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ê poderia checar em wp-includes / options.php embora ... mas usar update_option irá lidar com isso corretamente sem se preocupar com o banco de dados.

    
por Privateer 24.01.2015 / 20:16
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 plugin de um caso (mu) que só é executado sempre que você o ativa:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
    
por kaiser 10.10.2015 / 20:33
5

Eventos cron Wordpress também podem ser apagados da linha de comando, usando WP-CLI :

wp cron event list
wp cron event delete your_example_event

Mais detalhes nos wp-cli docs .

    
por Paul Wenzel 09.02.2017 / 16:57
1

No caso de alguém querer limpar um nome de cronificação específico (digamos "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);
    
por Indivision Dev 09.08.2016 / 12:17
1

Eu tive um ano cheio de trabalhos cron pendentes, cerca de 5 Mb de dados para essa entrada de banco de dados única. Excluiu os trabalhos agendados do banco de dados. Tarefas do cron desativadas em wp-config.php

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

Para excluir todas as tarefas agendadas pendentes, execute esta consulta no phpmyadmin > Execute a consulta:

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

Muito obrigado Pádraig Ó Beirn.

    
por Preetinder Singh 11.01.2017 / 21:40
0

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

As configurações ainda estarão lá e você não precisa editar nada. Basta ir ao [menu principal do UpdraftPlus] - > Configurações, e ir até o final e clicar em "Salvar alterações".

    
por Rebecca 05.06.2017 / 18:06
0

Eu cheguei aqui devido à grande quantidade de sm_ping cronjobs em wp_options . Se esse for o seu problema, você pode tentar o seguinte:

Coloque isso em functions.php (tema filho) se você não tem acesso ao phpmyadmin, especialmente se o seu site está inchado com o ping cronjobs (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
    
por Sitezilla 27.06.2018 / 20:52
0

Eu me deparei com um problema semelhante, onde, por causa de um dos meus próprios erros de codificação, milhares de cópias de um determinado trabalho do cron tinham sido adicionadas a um site. A função wp_clear_scheduled_hook apareceu para expirar e falhar. Passei por aí com um script que anula todas as instâncias da função cron na matriz e, em seguida, adiciona a matriz filtrada como a nova opção cron na tabela de opções. Veja abaixo.

Dessa forma, evitei eliminar os trabalhos cron desejáveis anteriormente adicionados ao site.

Isso pode ser modificado como uma função que usa uma matriz de identificadores para eliminar ou uma matriz de identificadores a serem preservadas.

$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);
    
por David F. Carr 23.11.2018 / 19:19

Tags