Eliminar miles de trabajos cron

14

Descubrí que tengo 29,000 trabajos cron en mi base de datos de WordPress a partir de complementos desactivados y eliminados. He probado varios complementos del optimizador, pero la gran cantidad de trabajos cron significa que no puedo eliminarlos mediante complementos.

También probé esto en mis funciones.php sin éxito:

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

¿Hay algún comando SQL que pueda usar en phpmyadmin para buscar por cron hook y eliminarlos?

    
pregunta Pádraig Ó Beirn 24.01.2015 - 19:48

9 respuestas

18

Gracias a Privateer por la pronta respuesta y el consejo.

Encontré una forma de evitarlo antes de ver tu respuesta. Este es un método paso a paso para eliminar miles de trabajos cron antiguos y puede ser de utilidad para otra persona.

He iniciado sesión en phpMyAdmin. Hice clic en mi base de datos y luego en la pestaña 'buscar'. Escribí 'cron', luego seleccioné 'todas las tablas' y hice clic en 'Ir'. Desplegé la lista de resultados de búsqueda a mi tabla wp_options. Hice clic en "Examinar". En la parte superior de la lista estaba option_name 'cron'. Hice clic en 'Editar' y esperé a que se cargara la página. Hice clic en el cuadro que mostraba la lista de trabajos cron. La lista de cron era tan larga que el cursor tardó unos 80 segundos en responder. Luego utilicé Ctrl-A en el teclado para seleccionar todo antes de presionar el botón de eliminar. Pasaron unos 2 minutos hasta que mi navegador completó la eliminación (Chrome agotó el tiempo de espera, así que probé Firefox, que funcionó).

Después de otro par de minutos, los trabajos cron para mis complementos activos actuales rellenaron la lista. Hubo 9 empleos cron (¡de los 29,000!). Seis años de trabajos cron duplicados de complementos mal codificados, algunos de los cuales acabo de instalar durante un día para probar. También cientos de complementos comunes como Wordfence, BackupBuddy, Nextgen Gallery y AutoOptimizer, todos los cuales había desinstalado en el pasado. Mi sitio ahora se carga como si hubiera sido turbo-cargado. El área de administración es mucho más rápida. Los errores de tiempo de espera del administrador han desaparecido. Pasé mucho tiempo optimizando mi sitio web intentando reducir el tiempo de carga. Incluso moví hosts y actualicé mis planes de hosting. Nada aumentó la velocidad de mi sitio, como eliminar todos los trabajos cron desactualizados. El tiempo de descarga móvil disminuyó de 20 segundos a 6 segundos. El tiempo de descarga de escritorio disminuyó de aproximadamente 12 a 4 segundos.

En mi búsqueda de una solución, encontré muy poca información sobre el efecto de los trabajos cron en el rendimiento del sitio web. Muchos dijeron que hacía poca diferencia y que para una pequeña cantidad de trabajos cron es cierto. Pero años en la vida de un sitio de WordPress me pregunto cuántos están hinchados con cientos, si no miles de trabajos cron antiguos de complementos eliminados. En lugar de pedir a los usuarios que verifiquen su límite de memoria de php, sugeriría que los desarrolladores primero les pidan a los usuarios que verifiquen la cantidad de trabajos cron en wp_options cuando resuelvan problemas en los errores fatales de memoria. ¡Usted puede ser sorprendido / sorprendido por lo que encuentra! :-)

    
respondido por el Pádraig Ó Beirn 31.01.2015 - 17:29
10

Probar

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

Si lo encuentra, puede intentarlo:

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

Es posible que necesite eliminar la opción cron o establecer el valor en una matriz serializada vacía.

Usar update_option sería más seguro ya que no estoy seguro de si el valor debe ser una matriz vacía serializada o una cadena vacía. Aunque puede consultar wp-includes / options.php ... pero el uso de update_option lo manejará adecuadamente sin preocuparse por la base de datos.

    
respondido por el Privateer 24.01.2015 - 20:16
6

Una solución aún más simple es llamar a delete_option( 'cron' ); una vez en algún complemento. Todos los trabajos cron agregados automáticamente se agregarán nuevamente en la próxima visita / solicitud de su sitio.

Como un complemento de un caso (mu) que solo se ejecuta cuando lo activas:

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

Los eventos cron de Wordpress también se pueden borrar desde la línea de comandos, usando WP-CLI :

wp cron event list
wp cron event delete your_example_event

Más detalles en wp-cli docs .

    
respondido por el Paul Wenzel 09.02.2017 - 16:57
1

En caso de que alguien quisiera borrar un nombre cron específico (diga 'CRON_NAME'), esta solución funcionó para mí:

    $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);
    
respondido por el Indivision Dev 09.08.2016 - 12:17
1

Tuve un año lleno de trabajos cron pendientes, aproximadamente 5 Mb de datos para esta única entrada de base de datos. Se eliminaron los trabajos cron de la base de datos. Trabajos cron deshabilitados en wp-config.php

Configura una tarea cron manual en cpanel. Ahora mi sitio está literalmente volando. Había estado actualizando los servidores, comprando más CPU / RAM, pero todo fue una pérdida de tiempo y dinero.

Para eliminar todas las tareas cron pendientes, ejecute esta consulta en phpmyadmin > Ejecutar consulta:

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

Muchas gracias Pádraig Ó Beirn.

    
respondido por el Preetinder Singh 11.01.2017 - 21:40
0

Si borra sus tareas cron de esta manera y utiliza UpdraftPlus, deberá volver a guardar sus configuraciones para regenerar las tareas cron. Hasta que haga esto, sus copias de seguridad automáticas no se ejecutarán (pero sí las copias de seguridad manuales).

La configuración seguirá estando allí y no es necesario editar nada. Simplemente vaya a [UpdraftPlus menú superior] - > Configuración, y desplácese hacia abajo hasta la parte inferior y haga clic en "Guardar cambios".

    
respondido por el Rebecca 05.06.2017 - 18:06
0

Llegué aquí debido a la enorme cantidad de sm_ping cronjobs en wp_options . Si ese es tu problema, puedes intentar lo siguiente:

Ponga esto en functions.php (tema secundario) si no tiene acceso a phpmyadmin, especialmente si su sitio está hinchado con ping cronjobs (sm_ping):

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

Me encontré con un problema similar, donde debido a uno de mis propios errores de codificación, se habían agregado miles de copias de un trabajo cron en particular a un sitio. La función wp_clear_scheduled_hook pareció agotarse y fallar. Lo resolví con un script que anula todas las instancias de la función cron dentro de la matriz y luego agrega la matriz filtrada como la nueva opción cron en la tabla de opciones. Vea abajo.

De esta manera, evité eliminar las tareas de cron deseables agregadas previamente al sitio.

Esto podría modificarse como una función que toma una serie de controladores para eliminar o una serie de controles para preservar.

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

Lea otras preguntas en las etiquetas