Eliminar miles de trabajos cron

24 ene 2015, 20:48:30
Vistas: 29.8K
Votos: 18

Descubrí que tengo 29,000 trabajos cron en mi base de datos de WordPress provenientes de plugins desactivados y eliminados. He probado varios plugins de optimización pero la enorme cantidad de trabajos cron significa que no puedo eliminarlos usando plugins.

También intenté esto en mi 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 hook de cron y eliminarlos?

1
Comentarios

Encontré WP Bulk Delete, úsalo con cuidado y establece un máximo de elementos para eliminar de una vez

Zwelly Zwelly
7 nov 2019 13:05:17
Todas las respuestas a la pregunta 11
4
20

Gracias Privateer por la rápida respuesta y los consejos.

Encontré una solución antes de ver tu respuesta. Aquí hay un método paso a paso para eliminar miles de trabajos cron antiguos que puede ser útil para otros.

Accedí a phpMyAdmin. Hice clic en mi base de datos y luego en la pestaña 'buscar'. Escribí 'cron', seleccioné 'todas las tablas' y hice clic en 'Ir'. Desplazándome por los resultados de búsqueda hasta la 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 cargara la página. Hice clic en el cuadro que mostraba la lista de trabajos cron. La lista era tan larga que tardó unos 80 segundos en responder el cursor. Luego usé Ctrl-A en el teclado para seleccionar todo antes de presionar el botón eliminar. Tardó unos 2 minutos antes de que mi navegador completara la eliminación (Chrome dio tiempo de espera, así que probé con Firefox que funcionó).

Después de un par de minutos, los trabajos cron de mis plugins activos actuales volvieron a poblar la lista. Había 9 trabajos cron (¡frente a más de 29,000!). Seis años de trabajos cron duplicados de plugins mal codificados, algunos de los cuales solo instalé por un día para probarlos. También cientos de plugins comunes como Wordfence, BackupBuddy, Nextgen Gallery y AutoOptimizer, todos los cuales había desinstalado en el pasado. Mi sitio ahora carga como si tuviera un turbo. El área de administración es mucho más rápida. Los errores de tiempo de espera en el administrador han desaparecido. Había pasado tanto tiempo optimizando mi sitio web tratando de disminuir el tiempo de carga. Incluso cambié de host y actualicé mis planes de alojamiento. Nada aumentó la velocidad de mi sitio como eliminar todos los trabajos cron obsoletos. El tiempo de descarga en móvil disminuyó de 20 segundos a 6 segundos. El tiempo de descarga en escritorio disminuyó de unos 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 decían que hacía poca diferencia y para un pequeño número de trabajos cron eso es cierto. Pero años después de la vida de un sitio WordPress, me pregunto cuántos están inflados con cientos o miles de trabajos cron antiguos de plugins eliminados. En lugar de pedir a los usuarios que verifiquen su límite de memoria PHP, sugeriría que los desarrolladores primero pidan a los usuarios que verifiquen la cantidad de trabajos cron en wp_options al solucionar errores fatales de memoria. ¡Pueden sorprenderse/impactarse con lo que encuentran! :-)

31 ene 2015 18:29:00
Comentarios

Encontré el mismo problema. No sé exactamente cuántos trabajos cron tenía, pero eran alrededor de 15 Mb en la base de datos. Después de eliminarlos, el tiempo de carga del área de administración disminuyó de 5-7 a 0.3 segundos. El tiempo de carga del frontend disminuyó de 2 a 0.4 segundos.

Alexey Alexey
5 sept 2015 23:10:04

¡Vaya! ¡Esta solución nos salvó! Teníamos 35000 trabajos cron en esta tabla. Ahora parece turboalimentado como describen.

Riccardo Riccardo
14 sept 2015 14:41:30

Muy bueno saberlo, ya que estaba pensando en instalar uno de los plugins mencionados para un cliente. Ahora sé qué buscar cuando el rendimiento se deteriora lentamente.

lowtechsun lowtechsun
28 jun 2018 01:24:21

Me salvaste el trasero. Gracias

MT3 MT3
7 mar 2023 18:28:05
2
11

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

wp cron event list
wp cron event delete your_example_event

Más detalles en la documentación de wp-cli.

9 feb 2017 17:57:41
Comentarios

O eliminar todos los eventos wp option delete cron

Ismail Ismail
20 abr 2018 01:12:32

wp option delete cron funciona cuando hay miles de trabajos cron almacenados en las opciones. Estos trabajos problemáticos provienen principalmente de plugins defectuosos que implementan cron de manera incorrecta.

Swashata Ghosh Swashata Ghosh
6 abr 2019 12:28:20
1
10

Prueba

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

Si lo encuentras, podrías intentar:

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

Puede que necesites eliminar la opción cron o establecer el valor como un array serializado vacío.

Usar update_option sería más seguro ya que no estoy seguro de si el valor debería ser un array serializado vacío o una cadena vacía. Podrías verificar en wp-includes/options.php... pero usar update_option lo manejará correctamente sin preocuparte por la base de datos.

24 ene 2015 21:16:47
Comentarios

¡Nunca hagas esto! Esto también eliminará las tareas cron predeterminadas establecidas por WordPress, que son necesarias para el funcionamiento normal.

peixotorms peixotorms
13 abr 2020 13:39:10
3

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

Como un plugin de un solo uso (mu) que solo se ejecuta cuando lo activas:

<?php
/** Plugin Name: Limpiar Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
10 oct 2015 21:33:51
Comentarios

¡Gracias kaiser! Para aquellos que no se sientan cómodos creando/editando plugins (¡es sencillo!), pueden usar lo que kaiser mencionó en su archivo functions.php. Simplemente añádanlo, guárdenlo, carguen su sitio, luego elimínenlo y guárdenlo de nuevo.

Privateer Privateer
10 oct 2015 23:02:18

¿Qué pasa con los trabajos cron que se han creado al activar el plugin? Estos trabajos cron no se recrearían hasta que desactives y reactives el plugin.

alpipego alpipego
15 mar 2016 23:30:48

Bueno, eso no es posible por defecto, ni con esto ni con las otras preguntas. Lo que tendrías que hacer es desactivar y reactivar esos plugins (~3 minutos de trabajo), o – en caso de que busques una solución automatizada – buscar las funciones en esos plugins y activarlas desde tu propio plugin.

kaiser kaiser
15 mar 2016 23:36:20
0

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

    $crons = _get_cron_array();
    //echo "Encontrados un total de ".count($crons)."<br />";
    //Mantener solo aquellos que no coincidan con el nombre del cron
    $updated = array_filter($crons, function($v){return !array_key_exists("CRON_NAME",$v);});
    //echo "Reducido a ".count($updated)."<br />";        
    _set_cron_array($updated);
9 ago 2016 13:17:27
1

Tuve un año lleno de trabajos cron pendientes, alrededor de 5 Mb de datos para esta única entrada de la base de datos. Eliminé los trabajos cron de la base de datos. Deshabilité los trabajos cron en wp-config.php.

Configuré un trabajo cron manual en cpanel. Ahora mi sitio literalmente vuela. Había estado actualizando servidores, comprando más CPU/RAM, pero todo fue un desperdicio de dinero y tiempo.

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

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

Muchas gracias Pádraig Ó Beirn.

11 ene 2017 22:40:02
Comentarios

¡De nada, Preetinder! Me alegra mucho que te haya sido útil. Gracias también por el consejo sobre los trabajos cron pendientes.

Pádraig Ó Beirn Pádraig Ó Beirn
12 ene 2017 21:16:58
0

Me encontré con un problema similar, donde debido a un error de codificación propio, se habían agregado miles de copias de un trabajo cron particular a un sitio. La función wp_clear_scheduled_hook parecía agotar el tiempo de espera y fallar. Lo solucioné con un script que elimina todas las instancias de la función cron dentro del array y luego agrega el array filtrado como la nueva opción cron en la tabla de opciones. Ver abajo.

De esta manera, evité eliminar los trabajos cron deseables que se habían agregado previamente al sitio.

Esto podría modificarse como una función que tome un array de handles para eliminar o un array de handles 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);
23 nov 2018 20:19:24
0

Tengo una forma muy sencilla de eliminar todos los eventos cron. Antes, necesitas DESACTIVAR WP Cron en wp-config Luego, instalas el Plugin WP Control Después, ve al menú Herramientas > Eventos Cron > Haz clic en seleccionar todos > Elimina todos ellos. ¿Podrías intentarlo? Gracias.

27 feb 2019 07:17:33
0

Ejecuta esto desde la línea de comandos (cli), utiliza wp-cli, básicamente recorre todos los eventos y los elimina uno por uno.

wp cron event list --fields=hook | tail -n +2 | xargs -I {} wp cron event delete {}

31 may 2024 15:11:29
0

Si borras tus tareas cron de esta manera y utilizas UpdraftPlus, necesitarás volver a guardar tus configuraciones para regenerar las tareas cron. Hasta que hagas esto, tus copias de seguridad automáticas no se ejecutarán (pero las copias manuales sí funcionarán).

Las configuraciones seguirán ahí, y no necesitas editar nada. Solo ve al [menú superior de UpdraftPlus]->Configuración, desplázate hacia abajo hasta el final y haz clic en "Guardar cambios".

5 jun 2017 19:06:22
0

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

Coloca esto en functions.php (del tema hijo) si no tienes acceso a phpmyadmin, especialmente si tu sitio está saturado con cronjobs de ping (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
    remove_action('do_pings', 'do_all_pings');
    wp_clear_scheduled_hook('do_pings');
}
27 jun 2018 21:52:36