Eliminar miles de trabajos cron

16

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

También probé esto en mis functions.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?

Pádraig Ó Beirn
fuente
Encontré la eliminación masiva de WP,
úsela

Respuestas:

18

Gracias Privateer por la pronta respuesta y asesoramiento.

Encontré una forma de evitarlo antes de ver tu respuesta. Aquí hay un método paso a paso para eliminar miles de trabajos cron antiguos y puede ser útil para otra persona.

Me conecté a phpMyAdmin. Hice clic en mi base de datos y luego en la pestaña 'buscar'. Escribí 'cron', luego seleccioné 'todas las tablas' e hice clic en 'Ir'. Desplacé 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 luego esperé a que se cargara la página. Hice clic en el cuadro que mostraba la lista de trabajos cron. La lista cron fue tan larga que tardó unos 80 segundos en responder mi cursor. Luego usé Ctrl-A en el teclado para seleccionar todo antes de presionar el botón Eliminar. Pasaron unos 2 minutos antes de que mi navegador completara la eliminación (se agotó el tiempo de espera de Chrome, así que probé Firefox que funcionó).

Después de otro par de minutos, los trabajos cron para mis complementos activos actuales volvieron a llenar la lista. Hubo 9 trabajos cron (¡por debajo de más de 29,000!). Seis años de trabajos cron duplicados de complementos mal codificados, algunos de los cuales acabo de instalar por 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 turbocargado. El área de administración es mucho más rápida. Los errores de tiempo de espera de administrador han desaparecido. Había pasado tanto tiempo optimizando mi sitio web tratando de disminuir el tiempo de carga. Incluso mudé hosts y actualicé mis planes de hosting. Nada aumentó la velocidad de mi sitio como eliminar todos los trabajos cron obsoletos. El tiempo de descarga móvil disminuyó de 20 segundos a 6 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 hizo poca diferencia y para un pequeño número de trabajos cron es cierto. Pero años después de la vida de un sitio de WordPress, me pregunto cuántos están inflados con cientos, si no miles, de trabajos cron antiguos de complementos eliminados. En lugar de pedirles a los usuarios que verifiquen su límite de memoria php, sugeriría que los desarrolladores primero soliciten a los usuarios que verifiquen la cantidad de trabajos cron en wp_options cuando resuelven errores fatales de memoria. ¡Puede sorprenderte / sorprenderte por lo que encuentres! :-)

Pádraig Ó Beirn
fuente
1
Encontré el mismo problema. Ahora no sé cuántos trabajos cron tenía, pero tenía alrededor de 15 Mb en la base de datos. Después de la eliminación, el tiempo de carga del área de administración disminuyó de 5-7 a 0.3 segundos. El tiempo de carga de la interfaz disminuyó de 2 a 0.4 segundos.
Alexey
1
¡maldición! ¡Esta solución nos salvó! tenía 35000 trabajos cron en esta tabla. ahora parece turboalimentado como se describe.
Riccardo
Muy bueno saberlo ya que estaba pensando en instalar uno de los complementos mencionados para un cliente. Así que ahora sé a qué prestar atención cuando el rendimiento se deteriora lentamente.
lowtechsun
10

Tratar

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

Si lo encuentra, puede probar:

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

Es posible que deba 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 debería ser una matriz vacía serializada o una cadena vacía. Sin embargo, puede registrar wp-includes / options.php ... pero el uso de update_option lo manejará correctamente sin preocuparse por la base de datos.

Corsario
fuente
7

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

wp cron event list
wp cron event delete your_example_event

Más detalles en los documentos wp-cli .

Paul Wenzel
fuente
3
O elimine todos los eventoswp option delete cron
Samuel Elh
1
wp option delete cronfunciona cuando hay miles de trabajos cron incluidos en las opciones. Estos trabajos malos provienen principalmente de complementos malos, haciendo cron de la manera incorrecta.
Swashata Ghosh
6

Una solución aún más simple es llamar 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 complemento de un caso (mu) que solo se ejecuta cada vez que lo activa:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
emperador
fuente
Gracias kaiser! Para aquellos que no se sienten cómodos con la creación / edición de complementos (¡es simple!), Puede usar lo que Kaiser anotó en su archivo functions.php. Simplemente agréguelo, guárdelo, cargue su sitio, luego elimínelo y guárdelo nuevamente.
Privateer
¿Qué pasa con los trabajos cron que se han creado en la activación del complemento? Estos trabajos cron no se volverán a crear hasta que desactive y reactive el complemento.
alpipego
Bueno, eso no es posible por defecto , ni con esto ni con las otras preguntas. Lo que tendría que hacer es desactivar y reactivar esos complementos (~ 3 minutos de trabajo) o, en caso de que esté buscando una respuesta automática, buscar las funciones en esos complementos y activarlos desde su complemento.
Kaiser
1

En caso de que alguien quisiera borrar un nombre cron específico (por ejemplo, '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);
Indivision Dev
fuente
1

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

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

Para eliminar todos los trabajos cron pendientes, ejecute esta consulta en phpmyadmin> Ejecutar consulta:

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

Muchas gracias Pádraig Ó Beirn.

Preetinder Singh
fuente
De nada Preetinder! Estoy encantado de que haya sido de ayuda. Gracias por el consejo sobre trabajos cron pendientes también.
Pádraig Ó Beirn
0

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

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

Rebecca
fuente
0

Llegué aquí por la gran cantidad de sm_pingcronjobs en wp_options. Si ese es su problema, puede intentar lo siguiente:

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

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

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

De esta manera, evité eliminar los trabajos cron deseables que se agregaron previamente al sitio.

Esto podría modificarse como una función que necesita eliminar una matriz de controladores o conservar una matriz de controladores.

$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);
David F. Carr
fuente
0

Tengo una manera muy simple de eliminar todos los eventos cron. Antes, debe DESACTIVAR WP Cron en wp-config. Luego, instala Plugin WP Control. Luego, vaya al menú Herramientas> Eventos de Cron> Haga clic en elegir todo> Eliminar todos. ¿Podrías intentarlo? Gracias.

Ventoso
fuente