Dokumentation · Integrationshandbuch

Server-Cron-Einrichtung

Dieses Dokument erklärt, warum ein echter Server-Cron-Job die empfohlene Methode ist, um Importe für das ADP Car Market Hub-Plugin in der Produktionsumgebung auszuführen, wie er sich zum integrierten WP-Cron-Scheduler verhält und welche betrieblichen Prüfungen eingerichtet werden sollten, sobald er läuft.

Wann Sie dieses Dokument verwenden sollten

Verwenden Sie dieses Dokument, wenn Sie:

  • Eine Produktionsbereitstellung vorbereiten und entscheiden, wie geplante Importe ausgelöst werden sollen.
  • Von WP-Cron auf einen serverseitigen Cron-Job migrieren, weil Importe auf einer Website mit wenig Traffic unzuverlässig sind.
  • Einen Hoster nutzen, der aus Performance-Gründen DISABLE_WP_CRON empfiehlt oder vorschreibt.
  • Überprüfen, warum Importe verspätet starten, nur zu Stoßzeiten ausgeführt werden oder überhaupt nicht starten.

Die Zielgruppe ist ein WordPress-Administrator mit Zugriff auf die Cron-Einrichtung des Servers (beispielsweise über cPanel, Plesk, das Hosting-Control-Panel oder Shell-Zugriff auf eine Linux-Crontab).

Übersicht

WordPress wird mit einem integrierten Scheduler namens WP-Cron ausgeliefert. WP-Cron läuft nicht kontinuierlich im Hintergrund – es wird überprüft, wenn jemand eine Seite auf der Website aufruft. Auf einer gut besuchten Website ist dies normalerweise in Ordnung, hat jedoch einige bekannte Einschränkungen:

  • Auf einer Website mit wenig Traffic werden geplante Aufgaben verspätet oder gar nicht ausgeführt, da kein Besucher WP-Cron auslöst.
  • WP-Cron wird innerhalb einer normalen HTTP-Anfrage ausgeführt, sodass es sich das PHP-Memory-Limit und die Ausführungszeit der Anfrage teilt.
  • Mehrere Besucher, die gleichzeitig eintreffen, können um die Ausführung derselben geplanten Aufgabe konkurrieren, was ineffizient ist, selbst wenn das Plugin intern vor Doppelstarts schützt.

Aus diesen Gründen ist die empfohlene Produktionskonfiguration, WP-Cron zu deaktivieren und es über einen echten Server-Cron-Job auszulösen. Das Plugin bietet speziell für diesen Zweck einen dedizierten, durch ein Token gesicherten REST-Endpunkt, sodass der Cron-Job einen Import direkt auslöst, ohne von einem Besucher abhängig zu sein.

Das Plugin bietet zwei Cron-Modi, die Sie unter Car Market Hub → Import & Limits (auf der Karte „Automatisierung“) auswählen können:

  • WP-Cron-Modus (Standard). Der WP-Cron-Zeitplan des Plugins (stündlich, alle 6 Stunden, zweimal täglich, täglich oder benutzerdefiniert mit einem Minimum von 15 Minuten) steuert die Importe. Geeignet für Entwicklung, Evaluierung und kleine Websites mit regelmäßigem Traffic.
  • Server-Cron-Modus. Der WP-Cron-Zeitplan wird deaktiviert und der Import wird durch einen Server-Cron-Job ausgelöst, der den REST-Endpunkt des Plugins aufruft. Empfohlen für die Produktion.

In beiden Modi wird die eigentliche Importarbeit vom selben gemeinsamen Runner innerhalb des Plugins ausgeführt – der einzige Unterschied besteht darin, was ihn auslöst.

Warum Server-Cron in der Produktion empfohlen wird

  • Zuverlässiges Timing. Ein Server-Cron-Job läuft nach einem festen Zeitplan, unabhängig davon, ob in diesem Moment jemand die Website besucht.
  • Keine Beeinträchtigung der Ladezeit. Importe verlangsamen den Seitenaufbau eines echten Besuchers nicht, da sie in ihrem eigenen PHP-Prozess laufen.
  • Vorhersehbarer Ressourcenverbrauch. Ein Server-Cron-Job läuft einmal pro geplantem Zeitpunkt, anstatt opportunistisch von jedem Besucher angestoßen zu werden.
  • Einfachere Überwachung. Cron-Ausführungen hinterlassen ein klares Audit-Protokoll (in den Protokollen des Cron-Dienstes und in den Protokollen des Plugins) und können mit externen Uptime-Prüfungen gekoppelt werden.
  • Kompatibel mit Hostern, die WP-Cron drosseln oder deaktivieren. Einige Managed-Hoster begrenzen, wie oft wp-cron.php intern ausgeführt wird; ein externer Trigger umgeht dies.

Der Server-Cron lässt sich auch hervorragend mit der Bildwarteschlange des Plugins kombinieren: Ein zweiter Cron-Job, der wp-cron.php in kurzem Intervall aufruft, sorgt dafür, dass die normale Aufgabenwarteschlange von WordPress (einschließlich der Bildverarbeitung) in einem vorhersehbaren Rhythmus läuft.

Voraussetzungen

Bestätigen Sie vor dem Wechsel zum Server-Cron Folgendes:

  • Das Plugin ist installiert, aktiviert und die API-Verbindung funktioniert. Siehe Einrichtung der API-Zugangsdaten und Verbindungstest.
  • Die Hosting-Umgebung bietet Zugriff auf die Cron-Einrichtung des Servers (cPanel-Cron-Jobs, geplante Aufgaben in Plesk, Hosting-Control-Panel-Cron oder eine Linux-Crontab über SSH).
  • Die Website kann vom Cron-Job über HTTPS erreicht werden. Bei den meisten Hostern läuft der Cron-Befehl auf demselben Server und kann curl verwenden, um die Website aufzurufen.
  • Sie können wp-config.php bearbeiten (dies ist erforderlich, um DISABLE_WP_CRON zu setzen).
  • Die allgemeinen Anforderungen für Hosting und Cron-Jobs und Hintergrundverarbeitung sind erfüllt.

Schritt-für-Schritt-Anleitung

Die Karte „Automatisierung“ des Plugins zeigt die genaue REST-Trigger-URL und Beispielbefehle für die aktuelle Installation an. Verwenden Sie diese Werte, anstatt URLs aus der Dokumentation zu kopieren.

  1. Schalten Sie das Plugin in den Server-Cron-Modus. Öffnen Sie Car Market Hub → Import & Limits. Wählen Sie auf der Karte für den Cron-Modus Server-Cron und speichern Sie. Das Plugin blendet die WP-Cron-Zeitplansteuerungen aus und zeigt eine Karte Server-Cron-Einrichtung mit der REST-Trigger-URL, dem geheimen Token und Beispielbefehlen an.
  2. Deaktivieren Sie den integrierten Cron von WordPress. Fügen Sie die folgende Zeile in wp-config.php ein, irgendwo oberhalb des Kommentars /* That's all, stop editing! */:
   define( 'DISABLE_WP_CRON', true );

Ohne diese Zeile versuchen sowohl WP-Cron als auch der Server-Cron-Job, Importe zu planen, was ineffizient ist, selbst wenn die interne Sperre des Plugins Doppelstarts verhindert.

  1. Kopieren Sie die REST-Trigger-URL. Die Karte Server-Cron-Einrichtung zeigt die URL im Format https://<your-site>/wp-json/as24ci/v1/cron-import?token=<secret> an. Verwenden Sie die Schaltfläche Kopieren, damit die URL wortwörtlich kopiert wird. Behandeln Sie das Token als Geheimnis – jeder, der es besitzt, kann einen Import auslösen.
  2. Fügen Sie den Import-Cron-Job hinzu. Erstellen Sie in der Cron-Einrichtung Ihres Servers einen Job, der die Trigger-URL im gewünschten Rhythmus aufruft. Das Plugin füllt ein Beispiel vor wie:
   */15 * * * * curl -s "https://<your-site>/wp-json/as24ci/v1/cron-import?token=<secret>" > /dev/null

Passen Sie den Zeitplanausdruck (*/15 * * * * bedeutet alle 15 Minuten) an die Bedürfnisse des Autohauses an. Importe überspringen unveränderte Fahrzeuge dank der Änderungserkennung, sodass häufige Ausführungen in der Regel ressourcenschonend sind.

  1. Fügen Sie einen zweiten Cron-Job hinzu, um die Aufgabenwarteschlange von WordPress am Laufen zu halten. Da DISABLE_WP_CRON auch die Warteschlange deaktiviert, die vom Bild-Worker des Plugins und von anderen WordPress-Funktionen verwendet wird, fügen Sie einen zweiten Cron-Job hinzu, der wp-cron.php direkt in einem kurzen Intervall ausführt. Das Beispiel des Plugins verwendet den absoluten Pfad der WordPress-Installation:
   */5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

Der Pfad wird auf der Karte „Automatisierung“ basierend auf der aktuellen WordPress-Installation angezeigt. Ersetzen Sie ihn durch den dort angezeigten Wert.

  1. Überprüfen Sie dies mit einer manuellen Ausführung. Rufen Sie von einer Workstation aus die REST-Trigger-URL einmal mit curl auf (oder fügen Sie sie in einen Browser ein). Eine erfolgreiche Ausführung gibt eine JSON-Antwort zurück, die das Importergebnis beschreibt. Ein 403-Fehler mit „Invalid or missing token“ bedeutet, dass die URL falsch kopiert wurde.
  2. Überprüfen Sie die nächste geplante Ausführung. Warten Sie auf den nächsten geplanten Cron-Takt, öffnen Sie dann Car Market Hub → System & Help und bestätigen Sie, dass Letzter externer Cron-Lauf einen aktuellen Zeitstempel anzeigt.

Für eine alternative Authentifizierungsmethode, die das Token aus der URL (und damit aus den Zugriffsprotokollen und Prozesslisten) heraushält, akzeptiert der Endpunkt auch einen Authorization: Bearer <token>-Header. Zum Beispiel:

*/15 * * * * curl -s -H "Authorization: Bearer <secret>" "https://<your-site>/wp-json/as24ci/v1/cron-import" > /dev/null

Beide Varianten sind gleichwertig; die Header-Variante wird bevorzugt, wenn die Cron-Umgebung benutzerdefinierte Header unterstützt.

Konfigurationsreferenz

Die Einstellungen, die den Server-Cron-Modus betreffen, befinden sich unter Car Market Hub → Import & Limits (Karte „Automatisierung“).

EinstellungZweck
Cron-ModusSchaltet zwischen WP-Cron und Server-Cron um. Im Server-Cron-Modus ist der WP-Cron-Zeitplan deaktiviert und die Karte Server-Cron-Einrichtung wird angezeigt.
REST-Trigger-URLDie vollständige URL, die der Server-Cron-Job aufrufen soll. Enthält das geheime Token als Query-Parameter. Generiert aus der aktuellen Website-URL und dem gespeicherten Token.
Geheimes TokenEin zufälliges Token mit 32 Zeichen, das den REST-Trigger authentifiziert. Wird bei der ersten Verwendung automatisch generiert. Verwenden Sie die Schaltfläche Token neu generieren, um ein neues auszugeben (der bestehende Cron-Job muss dann mit der neuen URL aktualisiert werden).
Beispiel-Cron-BefehleVorausgefüllte Beispielbefehle unter Verwendung der aktuellen Trigger-URL und des absoluten Pfads zu wp-cron.php. Verwenden Sie die Schaltflächen Kopieren, um sie wortwörtlich zu kopieren.
Max. Fahrzeuge pro Cron-LaufBegrenzt, wie viele Fahrzeuge ein einzelner Importlauf verarbeitet. 0 bedeutet unbegrenzt. Nützlich als Sicherheitsgrenze auf Shared-Hosting-Servern.
Bildwarteschlangen-ModusWenn aktiviert, laden geplante Importe sofort nur das erste Bild pro Fahrzeug herunter und reihen den Rest für die asynchrone Verarbeitung in die Warteschlange ein. Empfohlen in der Produktion.

Betriebliche Hinweise

  • Nur ein Scheduler gleichzeitig. Führen Sie den WP-Cron- und den Server-Cron-Modus nicht parallel aus. Das Umschalten auf Server-Cron im Plugin deaktiviert den WP-Cron-Zeitplan; das Hinzufügen von DISABLE_WP_CRON zu wp-config.php vervollständigt das Bild, indem verhindert wird, dass WordPress seine Cron-Warteschlange über Frontend-Anfragen ausführt.
  • Der gemeinsame Runner. Der REST-Endpunkt, der WP-Cron-Hook und die Admin-Schaltfläche Jetzt auslösen delegieren alle an denselben Import-Runner innerhalb des Plugins. Es gibt keinen separaten „Server-Cron-Importpfad“ mit anderem Verhalten.
  • Sicherheit bei Gleichzeitigkeit. Der Runner verwendet eine interne, auf Transients basierende Sperre, um zu verhindern, dass zwei Importe gleichzeitig ausgeführt werden. Selbst wenn sich ein Cron-Job überschneidet, wird der zweite Lauf vorzeitig abgebrochen.
  • Vertraulichkeit des Tokens. Das Cron-Token berechtigt zum Auslösen eines Imports. Behandeln Sie es als Geheimnis. Vermeiden Sie es, vollständige Trigger-URLs in Screenshots oder Tickets einzufügen; schwärzen Sie den Teil token=... vor dem Teilen.
  • Token-Rotation. Verwenden Sie Token neu generieren, wann immer Sie vermuten, dass das Token offengelegt wurde, oder im Rahmen einer regelmäßigen Rotation. Aktualisieren Sie nach der Neugenerierung jeden Cron-Job, der die URL verwendet – die vorherige URL wird abgewiesen.
  • Speicherort des Endpunkts. Der REST-Endpunkt ist die standardmäßige WordPress-REST-URL …/wp-json/as24ci/v1/cron-import. Wenn sich die WordPress-Website-URL ändert (HTTPS-Migration, Domainänderung, Multi-Site-Verschiebung), aktualisieren Sie den Cron-Job entsprechend.
  • Externer Heartbeat. Jede Anfrage an die Website, die ?as24ci_cron=1 enthält, zeichnet einen Zeitstempel auf, den der Tab „System & Help“ verwendet, um zu bestätigen, dass ein externer Scheduler aktiv ist. Dies dient rein der Information und löst an sich keinen Import aus.
  • Begleitjob für die Bildwarteschlange. Wenn Bilder während geplanter Importe in die Warteschlange eingereiht werden, wird die Warteschlange von der WordPress-Aufgabenwarteschlange verarbeitet. Wenn Sie WP-Cron deaktiviert haben, sorgt der zweite Cron-Job, der wp-cron.php aufruft, dafür, dass diese Warteschlange in Bewegung bleibt.
  • Verlassen Sie sich nicht auf browserbasierte Tests. Das Einfügen der Trigger-URL in einen Browser funktioniert zur Überprüfung, sollte aber nicht als eigentlicher Trigger verwendet werden – das würde voraussetzen, dass jemand einen Browser geöffnet hält.

Betriebliche Prüfungen nach der Einrichtung

Gehen Sie diese Prüfungen einmal nach dem Wechsel in den Server-Cron-Modus und erneut nach jeder größeren Änderung (Host-Migration, URL-Änderung, Token-Neugenerierung) durch:

  1. Cron-Dienst ist aktiviert. Bestätigen Sie, dass die Cron-Einrichtung des Hosters aktiv ist und dass das Benutzerkonto, das den Job ausführt, die Berechtigung hat, den Befehl auszuführen.
  2. Geplanter Befehl ist korrekt. Der Zeitplanausdruck entspricht der gewünschten Häufigkeit, die URL entspricht dem auf der Karte „Automatisierung“ angezeigten Wert und der zweite Job, der wp-cron.php aufruft, existiert.
  3. DISABLE_WP_CRON ist definiert. Der Tab „System & Help“ bestätigt, dass die Konstante gesetzt ist, wenn Sie sich im Server-Cron-Modus befinden.
  4. Letzter externer Cron-Lauf ist aktuell. Der Tab „System & Help“ zeigt einen Zeitstempel für Letzter externer Cron-Lauf innerhalb des erwarteten Intervalls.
  5. Letzter Importlauf ist aktuell. Das Dashboard-Widget und der Tab „System & Help“ zeigen aktuelle Aktivitäten des Importers.
  6. Protokolle zeigen keine wiederholten Authentifizierungsfehler. Ein Muster von 403-Antworten in den Protokollen bedeutet, dass der Cron-Job ein veraltetes oder falsches Token verwendet.
  7. Bildwarteschlange wird abgearbeitet. Der Tab „Import & Limits“ zeigt, dass die Bildwarteschlange verarbeitet wird (oder leer ist).
  8. Optionaler externer Monitor. Konfigurieren Sie einen Uptime-Monitor oder einen Alarm auf Hosting-Ebene, der Sie benachrichtigt, wenn der Import-Job nicht mehr ausgeführt wird.

Überprüfen Sie diese Punkte anhand der aktuellen Plugin-Version, bevor Sie Anweisungen für Kunden veröffentlichen, da sich die UI-Labels zwischen den Versionen ändern können.

Fehlerbehebung

SymptomWahrscheinliche UrsacheWas zu prüfen ist
Der Cron-Job läuft, aber die Antwort ist 403 mit "Invalid or missing token".Das Token in der URL ist falsch, enthält Leerzeichen oder wurde nach der Erstellung des Cron-Jobs neu generiert.Kopieren Sie die URL erneut aus der Automatisierungskarte und aktualisieren Sie den Cron-Befehl.
Der Cron-Job läuft, aber die Antwort ist 403 mit "Cron token not configured".Das Token wurde noch nicht generiert.Öffnen Sie die Automatisierungskarte, um automatisch ein Token zu generieren, und kopieren Sie dann die neue URL.
Der Cron-Job läuft erfolgreich, aber der Reiter „System & Hilfe“ zeigt immer noch keinen aktuellen externen Durchlauf an.Der Cron-Dienst ruft einen anderen Host auf (z. B. HTTP statt HTTPS oder www. im Vergleich zum kanonischen Hostnamen) und die Anfrage wird von WordPress wegeleitet.Verwenden Sie genau die URL, die auf der Automatisierungskarte angezeigt wird. Stellen Sie sicher, dass der Cron-Dienst des Hosts die Website über HTTPS erreichen kann.
Importe laufen, aber Bildanhänge werden nicht mehr angezeigt.DISABLE_WP_CRON ist aktiviert, aber kein Cron-Job ruft wp-cron.php auf, sodass der Bild-Warteschlangen-Worker nie ausgeführt wird.Fügen Sie den zweiten Cron-Job für wp-cron.php wie oben beschrieben hinzu.
Importe dauern zu lange oder stoßen an ein Speicherlimit.Die PHP-CLI-Grenzwerte des Hosts sind strenger als erwartet.Reduzieren Sie Max. Fahrzeuge pro Cron-Durchlauf, lassen Sie den Bild-Warteschlangen-Modus aktiviert und lesen Sie Cron-Jobs und Hintergrundverarbeitung.
Importe laufen zweimal kurz nacheinander ab.Sowohl der WP-Cron-Modus als auch ein Server-Cron-Job sind aktiv.Schalten Sie das Plugin in den Server-Cron-Modus und fügen Sie DISABLE_WP_CRON zu wp-config.php hinzu.
Der Cron-Job läuft, gibt aber immer „Another import is already running“ zurück.Ein vorheriger Durchlauf wurde nicht beendet (lang laufender Batch, hostseitiges Timeout). Die temporäre Sperre (Transient Lock) ist noch nicht abgelaufen.Warten Sie, bis die Sperre abläuft, und untersuchen Sie dann den vorherigen Durchlauf über die Plugin-Protokolle. Siehe Cron-Fehler.

Zugehörige Dokumente