web-dev-qa-db-fra.com

Supprimer des milliers de tâches cron

J'ai découvert que ma base de données WordPress contenait 29 000 tâches cron provenant 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 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?

15
Pádraig Ó Beirn

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

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 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 "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 achever la suppression (chrome expiré, j'ai donc essayé Firefox qui fonctionnait).

Après quelques minutes supplémentaires, les tâches cron de mes plugins actifs actuels ont ré-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 bourrés de centaines, voire de milliers, d'anciens jobs cron 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! :-)

18
Pádraig Ó Beirn

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 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.

10
Privateer

Les événements Wordpress cron 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 wp-cli docs .

7
Paul Wenzel

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 plugin à cas unique (mu) qui ne s'exécute que lorsque vous l'activez:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
6
kaiser

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);
1
Indivision Dev

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 é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.

1
Preetinder Singh

J'ai rencontré un problème similaire dans lequel, à cause 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 façon, j'ai évité de supprimer les travaux cron souhaitables précédemment ajoutés au site.

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

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 le plug-in WP Control. Ensuite, choisissez le menu Outils> Événements Cron> Cliquez sur Tout choisir> Tout supprimer. Pourriez-vous l'essayer? Merci.

0
Windy

Si vous effacez vos tâches périodiques de cette manière 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'avez 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".

0
Rebecca

Je suis arrivé ici à cause de l'énorme quantité de sm_ping cronjobs 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 (sm_ping):

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