Hintergrund­prozesse in WordPress erstellen

Wenn ein PHP-Skript ausgeführt wird, lädt die Seite normalerweise so lang, bis die Aufgabe ausgeführt ist (oder es einen Fehler gibt). In vielen Fällen ist das auch kein Problem, da das Skript nicht lange braucht. Wenn es aber eine oder mehrere aufwendige Aufgaben erledigen muss und damit eventuell mehrere Minuten oder sogar Stunden beschäftigt ist, wäre es praktisch das im Hintergrund ablaufen zu lassen. Hier zeige ich, wie das in WordPress umgesetzt werden kann.

Vorteile von Hintergrund­prozessen

Hintergrundprozesse zu nutzen hat unterschiedliche Vorteile, zum Beispiel:

  • Verbesserte Erfahrung für Benutzerinnen und Benutzer, da sie keinen Tab offen lassen müssen, in dem der aufwendige Prozess läuft.
  • Aufgaben können in Unteraufgaben unterteilt werden, um Timeouts zu verhindern.

Hintergrund­prozesse für WordPress mit »Action Scheduler«

Action Scheduler ist eine Lösung für Hintergrundprozesse, die sowohl als Plugin installiert als auch als Bibliothek in ein eigenes Plugin integriert werden kann. Action Scheduler nutzt das WordPress-Hook-System und ermöglicht es, einen Action-Hook:

  • einmalig so schnell wie möglich,
  • einmalig zu einem bestimmten Zeitpunkt,
  • wiederholt in einem bestimmten Sekunden-Intervall oder
  • wiederholt in einem Cron-Intervall

auszuführen.

Zusätzlich kommt es mit einem Admin-Interface, das über WerkzeugeScheduled Actions erreichbar ist und die ausgeführten sowie geplanten Aktionen mit ihren Parametern und eventuellen Fehlermeldungen zeigt.

Installation

Das Tool kann auf verschiedene Arten installiert werden, zunächst steht die Entscheidung, ob es als normales WordPress-Plugin oder innerhalb eines eigenen Plugins genutzt werden soll. Ich zeige hier die Nutzung in einem eigenen Plugin und installiere Action Scheduler mit Composer:

composer require woocommerce/action-scheduler
Code-Sprache: Bash (bash)

Normalerweise würde ein Composer-Paket über den Autoloader von Composer geladen werden, allerdings funktioniert das mit Action Scheduler nicht, sondern wir müssen direkt die action-scheduler.php einbinden:

// Load action scheduler. $action_scheduler = require_once dirname( __FILE__ ) . '/vendor/woocommerce/action-scheduler/action-scheduler.php';
Code-Sprache: PHP (php)

Das war es dann aber schon, mehr müssen wir nicht tun, um unsere erste Aktion im Hintergrund auszuführen.

Hintergrund­prozess einrichten

Ich werde die Nutzung von Action Scheduler hier am Beispiel einer Aktion zeigen, die einmalig und schnellstmöglich ausgeführt wird. Alle weiteren Optionen und die notwendigen Parameter gibt es auf der API-Seite von Action Scheduler.

Um eine Aktion einmalig und so schnell wie möglich auszuführen, nutzen wir die Funktion as_enqueue_async_action(), die als ersten und einzig notwendigen Parameter den Namen des Action-Hooks erwartet, der ausgeführt werden soll.

Der folgende Code würde dafür sorgen, dass der Action-Hook one_time_action_asap für die schnellstmögliche einmalige Ausführung eingeplant wird, wenn der GET-Parameter one_time_action vorhanden ist, also beispielsweise bei example.com/?one_time_action. Und da wir vorher die Funktion one_time_function_asap() an diesen Action-Hook angehängt haben, wird diese dann im Hintergrund ausgeführt.

add_action( 'init', function() { add_action( 'one_time_action_asap', 'one_time_function_asap' ); if ( isset( $_GET['one_time_action'] ) ) { as_enqueue_async_action( 'one_time_action_asap' ); } } ); function one_time_function_asap() { // Some time-consuming task. }
Code-Sprache: PHP (php)

Über den zweiten Parameter von as_enqueue_async_action() können in einem Array Parameter an die Funktion übergeben werden, die als Hintergrundprozess ausgeführt wird. Nehmen wir an, der User gibt einen Wert in ein Feld ein, das dann als one_time_action in der URL übergeben wird und an den Hintergrundprozess weitergereicht werden soll:

add_action( 'init', function() { add_action( 'one_time_action_asap', 'one_time_function_asap' ); if ( isset( $_GET['one_time_action'] ) ) { as_enqueue_async_action( 'one_time_action_asap', [ $_GET['one_time_action'] ] ); } } ); function one_time_function_asap( $value ) { // Some time-consuming task. error_log( $value ); }
Code-Sprache: PHP (php)

In dem Beispiel-Code würde der Wert von one_time_action in das Error-Log geschrieben werden, sofern es aktiviert ist. Über mehrere Werte in dem Array können mehrere Parameter an die Funktion übergeben werden, und in der Liste der geplanten und ausgeführten Aktionen unter WerkzeugeScheduled Actions werden die übergebenen Werte angezeigt, was das Debugging sehr erleichtert.

Und damit hätten wir unsere erste (etwas sinnfreie, aber nun ja) Aktion erstellt, die im Hintergrund abläuft.

Fazit

Action Scheduler ist schnell einsatzbereit und nicht sehr kompliziert in der Anwendung, da es über bekannte WordPress-Mechanismen angesprochen werden kann.

Verglichen mit WP Background Processing, das ich in der ursprünglichen Version dieses Artikels vorgestellt habe, finde ich neben der einfacheren Integration zumindest für die Entwicklung sehr angenehm, dass die Aktionen in einem User-Interface angezeigt werden, wo sie zur Not auch vor dem Starten abgebrochen werden können.

Die Originalversion des Beitrags wurde am 14. April 2018 veröffentlicht.

10 Reaktionen zu »Hintergrund­prozesse in WordPress erstellen«

Erwähnungen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert