Supprimer des milliers de tâches cron

14

J'ai découvert que ma base de données WordPress contenait 29 000 tâches cron provenant de plug-ins 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 aussi essayé cela 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 le crochet automatique et la supprimer?

    
posée Pádraig Ó Beirn 24.01.2015 - 19:48

9 réponses

18

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

J'ai trouvé un moyen de contourner le problème avant de voir votre réponse. Voici une méthode étape par étape pour supprimer des milliers de tâches cron anciennes et pouvant ê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 "Go". J'ai fait défiler la liste des résultats de la recherche jusqu'à ma table wp_options. J'ai cliqué sur 'Parcourir'. En tête de liste se trouvait option_name 'cron'. J'ai cliqué sur 'Modifier' puis j'ai attendu que la page se charge. J'ai cliqué sur la boîte contenant la liste des tâches cron. La liste des tâches était si longue qu'il a fallu environ 80 secondes à mon curseur pour répondre. J'ai ensuite utilisé Ctrl-A sur le clavier pour tout sélectionner avant d'appuyer sur le bouton de suppression. Il a fallu environ 2 minutes à mon navigateur pour terminer la suppression (le délai de chronométrage de chrome est expiré, alors j’ai essayé Firefox qui fonctionnait).

Après quelques minutes, les tâches cron de mes plug-ins actifs en cours ont de nouveau rempli la liste. Il y avait 9 emplois cron (contre plus de 29 000!). Six années de tâches cron en double provenant de plugins mal codés, dont certains que je viens d’installer pour une journée à essayer. Des centaines de plugins courants tels que Wordfence, BackupBuddy, Nextgen Gallery et AutoOptimizer - que j'avais tous désinstallés par le passé. Mon site se charge maintenant comme s'il avait été turbo. La zone d'administration est beaucoup plus rapide. Les erreurs de temporisation d'administrateur ont disparu. J'avais passé beaucoup 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'augmentait la vitesse de mon site comme la suppression de tous les travaux cron obsolètes. Le temps de téléchargement mobile a été réduit de 20 à 6 secondes. Le temps de téléchargement sur le bureau a été réduit d’environ 12 à 4 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 des sites Web. Beaucoup ont dit que cela faisait peu de différence et que pour un petit nombre de tâches cron, c'est vrai. Mais des années dans la vie d'un site WordPress, je me demande combien d'entre eux sont surchargés de centaines, voire de milliers, d'anciens jobs cron provenant de plugins supprimés. Au lieu de demander aux utilisateurs de vérifier leur limite de mémoire php, je suggérerais que les développeurs demandent d’abord aux utilisateurs de vérifier le nombre de tâches cron dans wp_options lorsqu’il résout des problèmes de mémoire fatale. Vous pourriez être surpris / choqué par ce que vous trouvez! :-)

    
réponse donnée Pádraig Ó Beirn 31.01.2015 - 17:29
10

Essayez

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

Si vous le trouvez, essayez:

  • 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 sûr que la valeur soit un tableau vide sérialisé ou une chaîne vide. Vous pouvez vérifier dans wp-includes / options.php cependant ... mais utiliser update_option le gérera correctement sans se soucier de la base de données.

    
réponse donnée Privateer 24.01.2015 - 20:16
6

Une solution encore plus simple consiste à appeler delete_option( 'cron' ); une fois dans un plugin. Toutes les tâches cron ajoutées automatiquement seront ajoutées à la prochaine visite / demande de votre site.

En tant que plug-in à cas unique (mu) ne s'exécutant que lorsque vous l'activez:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
    
réponse donnée kaiser 10.10.2015 - 20:33
5

Les événements cron Wordpress peuvent également être effacés à partir de la ligne de commande, à l'aide de WP-CLI :

wp cron event list
wp cron event delete your_example_event

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

    
réponse donnée Paul Wenzel 09.02.2017 - 16:57
1

Au cas où quelqu'un voudrait effacer un nom de cron spécifique (dites "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);
    
réponse donnée Indivision Dev 09.08.2016 - 12:17
1

J'ai eu une année complète de tâches cron en attente, environ 5 Mo de données pour cette entrée de base de données unique. Supprimé les tâches cron de la base de données. Emplois cron handicapés dans wp-config.php

Configurez un travail manuel cron dans cpanel. Maintenant, mon site vole littéralement. J'avais mis à niveau des serveurs, acheté plus de ressources processeur / RAM, mais tout cela était une perte de temps et d'argent.

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.

    
réponse donnée Preetinder Singh 11.01.2017 - 21:40
0

Si vous effacez ainsi vos tâches périodiques et que vous utilisez UpdraftPlus, vous devrez ré-enregistrer vos paramètres afin de régénérer les tâches périodiques. En attendant, vos sauvegardes automatisées ne seront pas exécutées (mais les sauvegardes manuelles seront exécutées).

Les paramètres seront toujours là et vous n’aurez besoin de rien modifier. Allez simplement dans [Menu principal de UpdraftPlus] - > Paramètres, faites défiler l'écran jusqu'en bas et cliquez sur "Enregistrer les modifications".

    
réponse donnée Rebecca 05.06.2017 - 18:06
0

Je suis arrivé ici à cause de l'énorme quantité de sm_ping de tâches cron dans wp_options . Si tel est votre problème, vous pouvez essayer les solutions suivantes:

Mettez ceci dans functions.php (thème enfant) si vous n'avez pas accès à phpmyadmin, surtout si votre site est saturé de ping-pongs ping (sm_ping):

if (isset($_GET['doing_wp_cron'])) {
remove_action('do_pings', 'do_all_pings');
wp_clear_scheduled_hook('do_pings');
}
    
réponse donnée Sitezilla 27.06.2018 - 20:52
0

J'ai rencontré un problème similaire: en raison d'une de mes propres erreurs de codage, des milliers de copies d'un travail cron particulier avaient été ajoutées à un site. La fonction wp_clear_scheduled_hook semblait expirer et échouer. Je l'ai contourné avec un script qui désactive toutes les occurrences de la fonction cron dans le tableau, puis ajoute le tableau filtré en tant que nouvelle option cron dans le tableau des options. Voir ci-dessous.

De cette manière, j'ai évité de supprimer les travaux cron souhaitables précédemment ajoutés au site.

Ceci pourrait être modifié en tant que fonction prenant un tableau de descripteurs à éliminer ou un tableau de descripteurs à 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);
    
réponse donnée David F. Carr 23.11.2018 - 19:19

Lire d'autres questions sur les étiquettes