Supprimer des milliers de tâches cron

16

J'ai découvert que j'avais 29 000 tâches cron dans ma base de données WordPress à partir de plugins désactivés et supprimés. J'ai essayé un certain nombre de plugins d'optimisation mais le grand nombre de tâches cron signifie que je ne peux pas les supprimer à l'aide de plugins.

J'ai également essayé ceci dans mon functions.php sans succès:

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

Existe-t-il une commande SQL que je peux utiliser dans phpmyadmin pour rechercher par cron hook et les supprimer?

Pádraig Ó Beirn
la source
J'ai trouvé WP Bulk supprimer, utiliser avec précaution et mettre un maximum d'éléments à supprimer à la fois
Zwelly

Réponses:

18

Merci Privateer pour la réponse rapide et les conseils.

J'ai trouvé un moyen de le contourner avant de voir votre réponse. Voici une méthode étape par étape pour supprimer des milliers d'anciens travaux cron et peut être utile à quelqu'un d'autre.

Je me suis connecté à phpMyAdmin. J'ai cliqué sur ma base de données puis sur l'onglet «recherche». J'ai tapé «cron» puis sélectionné «toutes les tables» et cliqué sur «Aller». J'ai fait défiler la liste des résultats de la recherche jusqu'à ma table wp_options. J'ai cliqué sur «Parcourir». En haut de la liste se trouvait l'option_name 'cron'. J'ai cliqué sur «Modifier», puis j'ai attendu que la page se charge. J'ai cliqué sur la case qui montrait la liste des tâches cron. La liste cron était si longue qu'il a fallu environ 80 secondes pour que mon curseur réponde. J'ai ensuite utilisé Ctrl-A sur le clavier pour tout sélectionner avant d'appuyer sur le bouton Supprimer. Il a fallu environ 2 minutes avant que mon navigateur ne termine la suppression (délai d'expiration de chrome, j'ai donc essayé Firefox qui fonctionnait).

Après quelques minutes, les tâches cron pour mes plugins actifs actuels ont rempli à nouveau la liste. Il y avait 9 emplois cron (contre plus de 29 000!). Six ans de tâches cron en double à partir de plugins mal codés, dont certains que j'ai juste installés pendant une journée pour essayer. Des centaines de plugins courants tels que Wordfence, BackupBuddy, Nextgen Gallery et AutoOptimizer - tous que j'avais désinstallés dans le passé. Mon site se charge maintenant comme s'il avait été turbo. La zone d'administration est beaucoup plus rapide. Les erreurs de délai d'attente administrateur ont disparu. J'avais passé tellement de temps à optimiser mon site Web en essayant de réduire le temps de chargement. J'ai même déplacé des hôtes et mis à jour mes plans d'hébergement. Rien n'a augmenté la vitesse de mon site comme la suppression de toutes les tâches cron obsolètes. Le temps de téléchargement mobile est passé de 20 secondes à 6 secondes.

Dans ma recherche d'une solution, j'ai trouvé très peu d'informations sur l'effet des tâches cron sur les performances du site Web. Beaucoup ont dit que cela faisait peu de différence et c'est vrai pour un petit nombre de tâches cron. Mais des années dans la vie d'un site WordPress, je me demande combien sont remplis de centaines, voire de milliers d'anciens travaux cron provenant de plugins supprimés. Au lieu de demander aux utilisateurs de vérifier leur limite de mémoire php, je suggère que les développeurs demandent d'abord aux utilisateurs de vérifier le nombre de tâches cron dans wp_options lors de la résolution d'erreurs fatales de la mémoire. Vous pourriez être surpris / choqué par ce que vous trouverez! :-)

Pádraig Ó Beirn
la source
1
J'ai trouvé le même problème. Je ne sais pas maintenant combien de tâches cron j'avais, mais c'était environ 15 Mo dans la base de données. Après la suppression, le temps de chargement de la zone d'administration est passé de 5-7 à 0,3 seconde. Le temps de chargement frontal est passé de 2 à 0,4 s.
Alexey
1
bon sang! cette solution nous a sauvés! avait 35 000 tâches cron dans ce tableau. maintenant, il semble turbocompressé comme décrit.
Riccardo
Très bon à savoir en effet puisque je pensais installer l'un des plugins mentionnés pour un client. Alors maintenant, je sais quoi surveiller lorsque les performances se détériorent lentement.
lowtechsun
10

Essayer

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

Si vous le trouvez, vous pouvez essayer:

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

Vous devrez peut-être supprimer l'option cron ou définir la valeur sur un tableau sérialisé vide.

Utiliser update_option serait plus sûr car je ne suis pas certain si la valeur doit être un tableau vide sérialisé ou une chaîne vide. Vous pouvez cependant archiver wp-includes / options.php ... mais l'utilisation de update_option le traitera correctement sans se soucier de la base de données.

Corsaire
la source
7

Les événements cron de Wordpress peuvent également être effacés de la ligne de commande, en utilisant WP-CLI :

wp cron event list
wp cron event delete your_example_event

Plus de détails dans les documents wp-cli .

Paul Wenzel
la source
3
Ou supprimez tous les événementswp option delete cron
Samuel Elh
1
wp option delete cronfonctionne quand il y a des milliers de tâches cron bourrées dans les options. Ces mauvais travaux proviennent principalement de mauvais plugins, faisant du cron dans le mauvais sens.
Swashata Ghosh
6

Une solution encore plus simple consiste à appeler delete_option( 'cron' );une fois dans un plugin. Tous les travaux cron ajoutés automatiquement seront à nouveau ajoutés lors de la prochaine visite / demande de votre site.

En tant que plugin à un cas (mu) qui ne s'exécute que lorsque vous l'activez:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
kaiser
la source
Merci kaiser! Pour ceux qui ne sont pas à l'aise avec la création / modification de plugins (c'est simple!), Vous pouvez utiliser ce que Kaiser a noté dans votre fichier functions.php. Ajoutez-le, enregistrez-le, chargez votre site, puis supprimez-le et enregistrez-le à nouveau.
Privateer
Qu'en est-il des tâches cron qui ont été créées lors de l'activation du plugin? Ces tâches cron ne seront pas recréées tant que vous n'aurez pas désactivé et réactivé le plugin.
alpipego
Eh bien, ce n'est pas possible par défaut , ni avec cela ni avec les autres questions. Ce que vous auriez à faire est de désactiver et réactiver ces plugins (~ 3 minutes de travail), ou - dans le cas où vous recherchez une réponse automatisée - rechercher les fonctions dans ces plugins et les déclencher à partir de votre plugin.
kaiser
1

Au cas où quelqu'un voudrait effacer un nom de cron spécifique (disons 'CRON_NAME'), cette solution a fonctionné pour moi:

    $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
la source
1

J'ai eu une année pleine de tâches cron en attente, environ 5 Mo de données pour cette seule entrée de base de données. Suppression des tâches cron de la base de données. Tâches cron désactivées dans wp-config.php

Configurer une tâche cron manuelle dans cpanel. Maintenant, mon site vole littéralement. J'avais mis à niveau les serveurs, acheté plus de CPU / RAM, mais tout était une perte d'argent et de temps.

Pour supprimer tous les travaux cron en attente, exécutez cette requête dans phpmyadmin> Exécuter la requête:

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

Merci beaucoup Pádraig Ó Beirn.

Preetinder Singh
la source
Vous êtes les bienvenus Preetinder! Je suis ravi que ce soit utile. Merci également pour le conseil sur les tâches cron en attente.
Pádraig Ó Beirn
0

Si vous effacez vos tâches cron de cette façon et que vous utilisez UpdraftPlus, vous devrez réenregistrer vos paramètres afin de régénérer les tâches cron. Jusqu'à ce que vous le fassiez, vos sauvegardes automatisées ne s'exécuteront pas (mais les sauvegardes manuelles le seront).

Les paramètres seront toujours là et vous n'avez rien à modifier. Accédez simplement à [Menu supérieur UpdraftPlus] -> Paramètres, faites défiler vers le bas et cliquez sur "Enregistrer les modifications".

Rebecca
la source
0

Je suis arrivé ici à cause de l'énorme quantité de sm_pingcronjobs wp_options. Si tel est votre problème, vous pouvez essayer ce qui suit:

Mettez ceci dans functions.php (thème enfant) si vous n'avez pas accès à phpmyadmin, surtout si votre site est gonflé 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
la source
0

J'ai rencontré un problème similaire, où en raison d'une de mes propres erreurs de codage, des milliers de copies d'une tâche cron particulière avaient été ajoutées à un site. La fonction wp_clear_scheduled_hook a semblé expirer et échouer. Je l'ai contourné avec un script qui annule toutes les instances de la fonction cron dans le tableau, puis ajoute le tableau filtré comme nouvelle option cron dans le tableau des options. Voir ci-dessous.

De cette façon, j'ai évité de supprimer les tâches cron souhaitables précédemment ajoutées au site.

Cela pourrait être modifié comme une fonction qui prend un tableau de poignées à éliminer ou un tableau de poignées à conserver.

$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
la source
0

J'ai un moyen très simple de supprimer tous les événements cron. Avant, vous devez DÉSACTIVER WP Cron dans wp-config Ensuite, vous installez Plugin WP Control Ensuite, allez dans le menu Outils> Événements Cron> Cliquez sur Tout choisir> Supprimez tous. Pourriez-vous l'essayer. Merci.

Venteux
la source