Action Scheduler und WP-Cron: Überprüfung auf hängengebliebene Hintergrundaufgaben

WordPress 6 Min. Lesezeit

Die Datenbank eines Online-Shops verdoppelt sich im Laufe von Monaten, obwohl sich „nichts geändert hat“ und die Seite auf der Benutzeroberfläche schnell lädt. In solchen Fällen sind häufig die Tabellen des Action Schedulers die Ursache: Hunderttausende fehlgeschlagene oder ausstehende Aufgaben stammen von einem Plugin, das bereits vor langer Zeit entfernt wurde und das das System immer wieder zu führen versucht.

In WordPress arbeiten zwei Hintergrundprozesssysteme parallel, und wenn es zu einer Störung kommt, sollten Sie beide überprüfen:

  • WP-Cron: der integrierte Scheduler von WordPress. Er richtet sich nicht nach der Serveruhr, sondern nach den Seitenaufrufen: Bei jedem Laden einer Seite prüft er, ob eine fällige Aufgabe vorliegt.
  • Action Scheduler: Eine mit WooCommerce gelieferte Aufgabenliste, die auch von vielen anderen Plugins genutzt wird (beispielsweise von Yoast SEO, MailPoet sowie Plugins für Abonnements und E-Mail-Versand). Die Aufgaben befinden sich in der Tabelle „actionscheduler_actions“, das Protokoll wird in der Tabelle „actionscheduler_logs“ gespeichert, und die Ausführung wird standardmäßig von WP-Cron gestartet.

Die folgenden Befehle haben wir auf einer mit WooCommerce installierten Test-Website im Terminal des cPanel-Hostings ausgeführt; die Grundlagen von WP-CLI werden im Artikel zur Verwendung von WP-CLI beschrieben.

Status des Action Schedulers

Auch ohne SSH können Sie dies im WordPress-Adminbereich einsehen: Auf der Seite „WooCommerce › Status“ können Sie auf der Registerkarte „Geplante Aktionen“ (Scheduled Actions) nach Status (ausstehend, fehlgeschlagen, abgeschlossen) und nach dem Namen der Aufgabe (Hook) filtern. Über die Befehlszeile geht es schneller:

cd ~/public_html
wp action-scheduler status
Data store: ActionScheduler_HybridStore
Runner: ActionScheduler_QueueRunner
Version: 4.1.0
status    count  oldest                      newest
complete  1      2026-10-27 19:56:51 +0000   2026-10-27 19:56:51 +0000
pending   2      2026-10-27 19:57:51 +0000   2026-10-28 03:00:00 +0000

Auf einer einwandfrei funktionierenden Website ist die Anzahl der „pending“ (ausstehenden) Aufgaben gering, und selbst die älteste wartet erst seit wenigen Minuten; die Anzahl der „failed“ (fehlgeschlagenen) Aufgaben ist gering, und deren Ursachen sind bekannt. Wenn die ausstehenden Aufgaben bereits seit Stunden warten, ist die Ausführung ins Stocken geraten; wenn es mehrere Tausend fehlgeschlagene Aufgaben gibt, weist ein Plugin wiederholt Fehler auf.

Welche Aufgabe ist in wie vielen Exemplaren noch offen oder ist fehlerhaft?

wp action-scheduler action list --status=pending --fields=id,hook,group,scheduled_date --per_page=20
wp action-scheduler action list --status=failed --format=count
wp action-scheduler action logs 1234

Der letzte Befehl zeigt das Protokoll einer Aufgabe an, einschließlich der Fehlerursache. Bei größeren Datenmengen ist eine Aggregation nach Aufgabennamen in SQL schneller. Auf den cPanel-Servern von aWh funktioniert die „wp db query“ nicht; verwenden Sie daher den Befehl „mysql“ (die Konfiguration der Datei „~/.my.cnf“, die das Passwort enthält, wird im WP-CLI-Artikel beschrieben) oder führen Sie die Abfrage in phpMyAdmin mit Ihrem eigenen Tabellenpräfix aus:

P=$(wp db prefix)
mysql "$(wp config get DB_NAME)" -e "SELECT hook, status, COUNT(*) AS db FROM ${P}actionscheduler_actions GROUP BY hook, status ORDER BY db DESC LIMIT 20"

Der Status von WP-Cron

wp cron event list --fields=hook,next_run_relative,recurrence
wp cron event list --due-now

Wenn viele Aufgaben bereits fällig sind (--due-now), aber nicht ausgeführt werden, startet WP-Cron nicht ordnungsgemäß – beispielsweise weil zu wenige Besucher vorhanden sind oder weil „DISABLE_WP_CRON“ aktiviert ist, es jedoch keine serverseitige Zeitplanung als Ersatz gibt.

Verwaise WP-Cron-Aufgaben (die zu einem entfernten Plugin gehören und deren Hooks nicht mehr überwacht werden):

wp eval 'foreach ( _get_cron_array() as $ts => $events ) { foreach ( $events as $hook => $x ) { if ( ! has_action( $hook ) ) echo "gazdátlan: $hook\n"; } }'

Sie können eine solche Aufgabe wie folgt löschen: wp cron event delete <hook>.

Reinigung

Sichern Sie zuvor die Datenbank (mit mysqldump; siehe den Artikel zu WP-CLI), da der Löschvorgang nicht rückgängig gemacht werden kann.

1. Löschen nicht zugewiesener Aufgaben

Suchen Sie nach den ausstehenden oder fehlgeschlagenen Aufgaben, für die kein Plugin mehr vorhanden ist:

wp eval 'global $wpdb; foreach ( $wpdb->get_col( "SELECT DISTINCT hook FROM {$wpdb->prefix}actionscheduler_actions WHERE status IN (\"pending\",\"failed\")" ) as $h ) { if ( ! has_action( $h ) ) echo $h, "\n"; }' > ~/gazdatlan-feladatok.txt
cat ~/gazdatlan-feladatok.txt

Sehen Sie sich die Liste an; wenn Ihnen ein Name bekannt vorkommt und Sie das Plugin noch benötigen, löschen Sie den Eintrag bitte nicht. Sie können ausstehende Aufgaben anhand ihres Namens zurückziehen:

while IFS= read -r hook; do wp action-scheduler action cancel "$hook" --all; done < ~/gazdatlan-feladatok.txt

Die canceledn und die alten fehlgeschlagenen Aufgaben werden im nächsten Schritt bereinigt.

2. Löschen alter Aufgaben und Protokolle

Der Action Scheduler löscht abgeschlossene und stornierte Aufgaben standardmäßig nach etwa einem Monat. Fehlgeschlagene Aufgaben werden nicht gelöscht, und sollte die Bereinigung aus irgendeinem Grund nicht ausgeführt werden, bleiben alle Daten erhalten. Manuell, in kleinen Schritten:

wp action-scheduler clean --status=complete,failed,canceled --before='14 days ago' --batch-size=500 --pause=1

Dank der Pause zwischen den Durchläufen (--pause) belastet die Bereinigung die Datenbank nicht, und die Website bleibt auch währenddessen schnell. Die Aufbewahrungsdauer können Sie mit einem „must-use“-Plugin verkürzen (wp-content/mu-plugins/action-scheduler-megorzes.php):

<?php
/**
 * Plugin Name: Action Scheduler: 14 napos megőrzés
 */
add_filter( 'action_scheduler_retention_period', function () {
    return 14 * DAY_IN_SECONDS;
} );

3. Komprimierung der Tabelle

Durch das Löschen werden die Zeilen freigegeben, die Tabelle auf der Festplatte bleibt jedoch unverändert groß. Führen Sie nach einer umfassenden Bereinigung in phpMyAdmin folgenden Vorgang durch (nach Auswahl der Tabellen: „Tabelle optimieren“) oder:

mysql "$(wp config get DB_NAME)" -e "OPTIMIZE TABLE ${P}actionscheduler_actions, ${P}actionscheduler_logs"

Sicherstellung eines zuverlässigen Betriebs

WP-Cront wird durch Seitenaufrufe ausgelöst. Daher können sich die Aufgaben in einem Online-Shop mit geringem Traffic während der Nacht um mehrere Stunden verzögern, während zu Spitzenzeiten eine ressourcenintensive Aufgabe das Laden der Seite für einen Besucher verlangsamen kann. Überlassen Sie die Ausführung dem Server:

  • Wenn Ihre Website über das WP Toolkit verwaltet wird, aktivieren Sie bitte auf der Seite Ihrer Website im Abschnitt „Leistung“ die Option „wp-cron.php-Datei übernehmen“.
  • Manuell: Deaktivieren Sie WP-Cron in der Datei „wp-config.php“ (define( 'DISABLE_WP_CRON', true );) und richten Sie stattdessen einen Cron-Job im cPanel ein. Die einzelnen Schritte werden im Artikel zum Ersetzen von WP-Cron beschrieben.

Bei einem Online-Shop mit hohem Datenverkehr können Sie die „Action Scheduler“-Zeile auch in einem separaten Cron-Job ausführen, und zwar in begrenzten Intervallen, damit nicht alle PHP-Prozesse belegt werden. Über die cPanel-Oberfläche für Cron-Jobs (Gruppe „Erweitert“) beispielsweise alle fünf Minuten:

/usr/local/bin/wp --path=/home/felhasznalonev/public_html action-scheduler run --batch-size=25 --batches=4 > /dev/null 2>&1

cPanel-Cron-Aufgaben: Hinzufügen einer neuen Aufgabe

Ein Hintergrundauftrag, der länger als eine Minute läuft und jedes Mal an derselben Stelle stehen bleibt, führt unbegrenzt viele Aufgaben aus: Dies muss vom Entwickler des Plugins behoben werden. Auch eine große Anzahl plötzlich eingehender Bestellungen (beispielsweise während einer Werbeaktion) kann gleichzeitig mehrere tausend Aufgaben auslösen; sollte die Website in solchen Fällen langsamer werden, zeigt die CloudLinux-Ressourcennutzung an, an welche Grenze das Konto stößt.

Regelmäßige Überprüfung

Überprüfen Sie monatlich die Ausgabe des „wp action-scheduler status“. Sollte die Anzahl der ausstehenden Aufgaben dauerhaft im Tausenderbereich liegen oder sich die fehlgeschlagenen Aufgaben häufen, ist dies ein Anzeichen für einen Fehler in einem Plugin – und es ist besser, dies innerhalb weniger Wochen zu bemerken als erst nach einem Jahr, wenn die Datenbank bereits mehrere Gigabyte groß ist. Die übrigen Tabellen der Datenbank werden in dem Artikel über die Bereinigung der Tabellen „wp_options“ und „wp_postmeta“ behandelt.

Zurück: WordPress-Artikel (43)