Löschen Tausende von Cron-Jobs

16

Ich habe festgestellt, dass meine WordPress-Datenbank 29.000 Cron-Jobs aus deaktivierten und gelöschten Plugins enthält. Ich habe eine Reihe von Optimierer-Plugins ausprobiert, aber die große Anzahl von Cron-Jobs bedeutet, dass ich sie nicht mit Plugins löschen kann.

Ich habe auch versucht, dies in meinem functions.php ohne Erfolg:

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

Gibt es einen SQL-Befehl, den ich in phpmyadmin verwenden kann, um nach Cron-Hooks zu suchen und diese zu entfernen?

Pádraig Ó Beirn
quelle
Ich fand WP Bulk löschen, mit Vorsicht verwenden und legte eine maximale
Anzahl

Antworten:

18

Vielen Dank an Privateer für die prompte Antwort und den Rat.

Ich habe einen Weg gefunden, bevor ich deine Antwort gesehen habe. Hier finden Sie eine schrittweise Methode zum Löschen von Tausenden von alten Cron-Jobs, die möglicherweise für andere von Nutzen sind.

Ich habe mich bei phpMyAdmin angemeldet. Ich klickte auf meine Datenbank und dann auf die Registerkarte "Suche". Ich habe 'cron' eingegeben, dann 'alle Tabellen' ausgewählt und auf 'Los' geklickt. Ich habe die Liste der Suchergebnisse zu meiner Tabelle wp_options gescrollt. Ich habe auf "Durchsuchen" geklickt. Ganz oben auf der Liste stand Optionsname 'cron'. Ich habe auf "Bearbeiten" geklickt und darauf gewartet, dass die Seite geladen wird. Ich klickte auf das Kästchen mit der Liste der Cronjobs. Die Cron-Liste war so lang, dass es ungefähr 80 Sekunden dauerte, bis mein Cursor reagierte. Ich habe dann Strg-A auf der Tastatur verwendet, um alle auszuwählen, bevor ich auf die Schaltfläche Löschen geklickt habe. Es dauerte ungefähr 2 Minuten, bis mein Browser den Löschvorgang abgeschlossen hatte (Chrome Timeout, also habe ich Firefox ausprobiert, was funktionierte).

Nach ein paar Minuten haben die Cron-Jobs für meine derzeit aktiven Plugins die Liste neu gefüllt. Es gab 9 Cron-Jobs (von über 29.000!). Sechs Jahre doppelte Cron-Jobs von schlecht codierten Plugins, von denen ich einige nur für einen Tag zum Ausprobieren installiert habe. Auch Hunderte von gängigen Plugins wie Wordfence, BackupBuddy, Nextgen Gallery und AutoOptimizer, die ich in der Vergangenheit deinstalliert hatte. Meine Website wird jetzt geladen, als wäre sie aufgeladen. Der Admin-Bereich ist viel schneller. Admin-Timeout-Fehler sind verschwunden. Ich hatte so viel Zeit mit der Optimierung meiner Website verbracht, um die Ladezeit zu verkürzen. Ich habe sogar die Hosts gewechselt und meine Hosting-Pläne aktualisiert. Nichts hat die Geschwindigkeit meiner Site erhöht, so wie das Löschen aller veralteten Cron-Jobs. Die Downloadzeit für Mobilgeräte wurde von 20 Sekunden auf 6 Sekunden verringert.

Auf meiner Suche nach einer Lösung fand ich nur sehr wenige Informationen über die Auswirkung von Cronjobs auf die Website-Leistung. Viele sagten, es mache wenig Unterschied und für eine kleine Anzahl von Cronjobs ist das wahr. Aber nach Jahren im Leben einer WordPress-Site frage ich mich, wie viele mit Hunderten, wenn nicht Tausenden von alten Cron-Jobs aus gelöschten Plugins aufgebläht sind. Anstatt die Benutzer aufzufordern, ihr PHP-Speicherlimit zu überprüfen, würde ich vorschlagen, dass die Entwickler die Benutzer zuerst auffordern, die Anzahl der Cron-Jobs in wp_options zu überprüfen, wenn schwerwiegende Speicherfehler behoben werden. Sie können überrascht / schockiert sein, was Sie finden! :-)

Pádraig Ó Beirn
quelle
1
Ich habe das gleiche Problem gefunden. Ich weiß jetzt nicht, wie viele Cronjobs ich hatte, aber es waren ungefähr 15 MB in der Datenbank. Nach dem Löschen wurde die Ladezeit des Admin-Bereichs von 5-7 auf 0,3 Sekunden verringert. Die Ladezeit des Frontends wurde von 2 auf 0,4 Sekunden verringert.
Alexey
1
verdammt! Diese Lösung hat uns gerettet! hatte 35000 Cron Jobs in dieser Tabelle. jetzt scheint es turboaufgeladen wie beschrieben.
Riccardo
Sehr gut zu wissen, da ich darüber nachdachte, eines der genannten Plugins für einen Client zu installieren. Jetzt weiß ich also, worauf ich achten muss, wenn sich die Leistung langsam verschlechtert.
Lowtechsun
10

Versuchen

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

Wenn Sie es finden, können Sie versuchen:

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

Möglicherweise müssen Sie entweder die Option cron löschen oder den Wert auf ein leeres serialisiertes Array festlegen.

Die Verwendung von update_option wäre sicherer, da ich nicht sicher bin, ob der Wert ein serialisiertes leeres Array oder eine leere Zeichenfolge sein soll. Sie könnten zwar in wp-includes / options.php einchecken ... aber die Verwendung von update_option erledigt dies ordnungsgemäß, ohne sich um die Datenbank zu kümmern.

Freibeuter
quelle
7

Wordpress-Cron-Ereignisse können auch über die Befehlszeile mit WP-CLI gelöscht werden :

wp cron event list
wp cron event delete your_example_event

Weitere Details finden Sie in den wp-cli-Dokumenten .

Paul Wenzel
quelle
3
Oder lösche alle Terminewp option delete cron
Samuel Elh
1
wp option delete cronfunktioniert, wenn die Optionen Tausende von Cronjobs enthalten. Diese schlechten Jobs kommen meistens von schlechten Plugins, die sich falsch verhalten.
Swashata Ghosh
6

Eine noch einfachere Lösung besteht darin, delete_option( 'cron' );ein Plugin einmal aufzurufen . Alle automatisch hinzugefügten Cron-Jobs werden beim nächsten Besuch / Aufruf Ihrer Site erneut hinzugefügt.

Als One-Case (mu) -Plugin, das nur ausgeführt wird, wenn Sie es aktivieren:

<?php
/** Plugin Name: Clean Cron */
register_activation_hook( __FILE__, function()
{
    delete_option( 'cron' );
} );
Kaiser
quelle
Danke Kaiser! Für diejenigen, die mit dem Erstellen / Bearbeiten von Plugins nicht vertraut sind (es ist ganz einfach!), Können Sie das verwenden, was kaiser in Ihrer functions.php-Datei vermerkt hat. Fügen Sie es einfach hinzu, speichern Sie es, laden Sie Ihre Site, entfernen Sie es und speichern Sie es erneut.
Privateer
Was ist mit Cron-Jobs, die bei der Aktivierung des Plugins erstellt wurden? Diese Cronjobs werden erst wieder erstellt, wenn Sie das Plugin deaktivieren und wieder aktivieren.
alpipego
Nun, das ist weder bei dieser noch bei den anderen Fragen standardmäßig möglich . Sie müssen diese Plugins entweder deaktivieren und reaktivieren (ca. 3 Minuten Arbeitszeit) oder - falls Sie nach einer automatisierten Antwort suchen - die Funktionen in diesen Plugins durchsuchen und sie über Ihr Plugin auslösen.
Kaiser
1

Für den Fall, dass jemand einen bestimmten Cron-Namen löschen wollte (sagen Sie 'CRON_NAME'), funktionierte diese Lösung für mich:

    $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
quelle
1

Ich hatte ein Jahr voller ausstehender Cron-Jobs, ungefähr 5 MB Daten für diesen einzelnen Datenbankeintrag. Löschte die Cron-Jobs aus der Datenbank. Inaktivierte Cron-Jobs in wp-config.php

Richten Sie einen manuellen Cron-Job in cpanel ein. Jetzt fliegt meine Seite buchstäblich. Ich hatte Server aufgerüstet, mehr CPU / RAM gekauft, aber alles war eine Verschwendung von Geld und Zeit.

Um alle ausstehenden Cron-Jobs zu löschen, führen Sie diese Abfrage in phpmyadmin> Abfrage ausführen aus:

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

Vielen Dank, Pádraig Ó Beirn.

Preetinder Singh
quelle
Gern geschehen Preetinder! Ich freue mich, dass es hilfreich war. Vielen Dank für den Tipp zu ausstehenden Cron-Jobs.
Pádraig Ó Beirn
0

Wenn Sie Ihre Cron-Aufgaben auf diese Weise löschen und UpdraftPlus verwenden, müssen Sie Ihre Einstellungen erneut speichern, um die Cron-Aufgaben neu zu generieren. Bis dahin werden Ihre automatisierten Sicherungen nicht ausgeführt (manuelle Sicherungen jedoch).

Die Einstellungen bleiben erhalten und Sie müssen nichts bearbeiten. Gehen Sie einfach zu [UpdraftPlus-Hauptmenü] -> Einstellungen und scrollen Sie nach unten und klicken Sie auf "Änderungen speichern".

Rebecca
quelle
0

Ich bin hierher gekommen, weil es so viele sm_pingCronjobs gibt wp_options. Wenn dies Ihr Problem ist, können Sie Folgendes versuchen:

Fügen Sie dies in die Datei functions.php (untergeordnetes Thema) ein, wenn Sie keinen Zugriff auf phpmyadmin haben, insbesondere, wenn Ihre Site mit Ping-Cronjobs (sm_ping) überfüllt ist:

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

Ich bin auf ein ähnliches Problem gestoßen, bei dem aufgrund eines meiner eigenen Codierungsfehler Tausende Kopien eines bestimmten Cron-Jobs zu einer Site hinzugefügt wurden. Die Funktion wp_clear_scheduled_hook hat eine Zeitüberschreitung und ist fehlgeschlagen. Ich habe es mit einem Skript umgangen, das alle Instanzen der Cron-Funktion innerhalb des Arrays deaktiviert und dann das gefilterte Array als neue Cron-Option in die Optionstabelle einfügt. Siehe unten.

Auf diese Weise habe ich vermieden, die gewünschten Cron-Jobs wegzublasen, die zuvor zur Site hinzugefügt wurden.

Dies kann als eine Funktion geändert werden, die ein Array von zu entfernenden Handles oder ein Array von zu bewahrenden Handles benötigt.

$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
quelle
0

Ich habe eine sehr einfache Möglichkeit, alle Cron-Ereignisse zu löschen. Vorher müssen Sie WP Cron in wp-config DEAKTIVIEREN. Anschließend installieren Sie das Plugin WP Control. Gehen Sie dann zu Tool> Cron-Ereignisse> Klicken Sie auf Alle auswählen> Alle löschen. Könntest du es versuchen? Vielen Dank.

Windig
quelle