Dokumentation · Integrationshandbuch
Einrichtung des Server-Cronjobs
Dieses Dokument erklärt, warum ein echter Server-Cronjob 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 Überprüfungen eingerichtet sein 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 Cronjob migrieren, weil Importe auf einer Website mit wenig Traffic unzuverlässig sind.
- Einen Host betreiben, der aus Performancegründen
DISABLE_WP_CRONempfiehlt oder vorschreibt. - Überprüfen, warum Importe verspätet starten, nur während der Hauptverkehrszeiten laufen 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 – er wird überprüft, wenn jemand eine Seite auf der Website aufruft. Auf einer stark frequentierten Website ist dies normalerweise in Ordnung, hat jedoch einige bekannte Einschränkungen:
- Auf einer Website mit wenig Traffic laufen geplante Aufgaben verspätet oder gar nicht, weil kein Besucher WP-Cron auslöst.
- WP-Cron läuft innerhalb einer normalen HTTP-Anfrage, teilt sich also das PHP-Memory-Limit und die Ausführungszeit der Anfrage.
- Mehrere Besucher, die gleichzeitig eintreffen, können um die Ausführung derselben geplanten Aufgabe konkurrieren, was verschwenderisch ist, selbst wenn das Plugin intern vor Doppelstarts schützt.
Aus diesen Gründen ist die empfohlene Produktionskonfiguration, WP-Cron zu deaktivieren und ihn über einen echten Server-Cronjob auszulösen. Das Plugin stellt speziell für diesen Zweck einen dedizierten, durch ein Token gesicherten REST-Endpunkt zur Verfügung, sodass der Cronjob 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 (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ässigem Traffic.
- Server-Cron-Modus. Der WP-Cron-Zeitplan ist deaktiviert und der Import wird durch einen Server-Cronjob 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 durchgeführt – der einzige Unterschied besteht darin, was ihn auslöst.
Dieser eine zentrale Zeitplan steuert jede verbundene Datenquelle. Die Live-Quellen (AutoScout24 und carcuro) haben kein eigenes Intervall; sie laufen nach diesem Zeitplan. Die Feed- und E-Mail-Quellen, die unter CMH Center → Universal Import konfiguriert sind, haben zusätzlich ihr eigenes Intervall. Siehe die Referenz zum Universal Import.
Warum Server-Cron in der Produktion empfohlen wird
- Zuverlässiges Timing. Ein Server-Cronjob 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-Cronjob läuft einmal pro geplantem Zeitpunkt, anstatt opportunistisch von jedem Besucher gestartet zu werden.
- Einfachere Überwachung. Cron-Läufe 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 Hosts, die WP-Cron drosseln oder deaktivieren. Einige Managed-Hosts schränken ein, wie oft
wp-cron.phpintern ausgeführt wird; ein externer Trigger umgeht dies.
Der Server-Cron lässt sich auch gut mit der Bildwarteschlange des Plugins kombinieren: Ein zweiter Cronjob, der wp-cron.php in einem kurzen Intervall aufruft, sorgt dafür, dass die normale Aufgabenwarteschlange von WordPress (einschliesslich 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-Cronjobs, geplante Aufgaben in Plesk, Hosting-Control-Panel-Cron oder eine Linux-Crontab über SSH).
- Die Website kann vom Cronjob über HTTPS erreicht werden. Bei den meisten Hosts läuft der Cron-Befehl auf demselben Server und kann
curlverwenden, um die Website aufzurufen. - Sie können
wp-config.phpbearbeiten (dies ist erforderlich, umDISABLE_WP_CRONzu setzen). - Die allgemeinen Anforderungen an das Hosting und die Cron- 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.
- Schalten Sie das Plugin in den Server-Cron-Modus. Öffnen Sie Car Market Hub → Import & Limits. Wählen Sie in der Cron-Modus-Karte Server-Cron und speichern Sie. Das Plugin blendet die WP-Cron-Zeitplansteuerungen aus und zeigt eine Karte Server-Cron-Einrichtung mit einer sauberen REST-Trigger-URL (kein Secret in der URL), einem separaten Block für den Authentifizierungs-Header und Beispielbefehlen an.
- Deaktivieren Sie den integrierten Cron von WordPress. Fügen Sie die folgende Zeile in
wp-config.phpein, 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-Cronjob, Importe zu planen, was verschwenderisch ist, selbst wenn die interne Sperre des Plugins Doppelstarts verhindert.
- Kopieren Sie die REST-Trigger-URL und den Authentifizierungs-Header. Die Karte Server-Cron-Einrichtung zeigt die Trigger-URL in der Form
https://<your-site>/wp-json/as24ci/v1/cron-importan (kein Secret – sicher in Skripten und Protokollen aufzubewahren) und separat den HeaderAuthorization: Bearer <token>, der das Secret enthält. Verwenden Sie die Kopieren-Schaltflächen, damit beide Werte wortgetreu kopiert werden. Das Token wird nach dem Generieren oder Neugenerieren nur einmal (für ca. 15 Minuten) angezeigt; danach wird nur noch ein Einweg-Hash gespeichert. Speichern Sie es daher in Ihrem Cronjob, bevor Sie die Seite verlassen. Behandeln Sie das Token wie ein Geheimnis – jeder, der es besitzt, kann einen Import auslösen. - Fügen Sie den Import-Cronjob hinzu. Erstellen Sie in der Cron-Einrichtung Ihres Servers einen Job, der die Trigger-URL im gewünschten Rhythmus aufruft und das Token im Header
Authorizationsendet. Das Plugin füllt ein Beispiel vor wie:
*/15 * * * * curl -s -H "Authorization: Bearer <secret>" "https://<your-site>/wp-json/as24ci/v1/cron-import" > /dev/null
Passen Sie den Zeitplanausdruck (*/15 * * * * bedeutet alle 15 Minuten) an die Bedürfnisse der Garage an. Importe überspringen unveränderte Fahrzeuge dank der Änderungserkennung, sodass häufige Durchläufe in der Regel ressourcenschonend sind.
- Fügen Sie einen zweiten Cronjob hinzu, um die Aufgabenwarteschlange von WordPress am Laufen zu halten. Da
DISABLE_WP_CRONauch die Warteschlange deaktiviert, die vom Bild-Worker des Plugins und von anderen WordPress-Funktionen verwendet wird, fügen Sie einen zweiten Cronjob hinzu, derwp-cron.phpdirekt 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 in der Karte "Automatisierung" basierend auf der aktuellen WordPress-Installation angezeigt. Ersetzen Sie ihn durch den dort angezeigten Wert.
- Überprüfen Sie dies mit einem manuellen Durchlauf. Rufen Sie von einer Workstation aus die REST-Trigger-URL einmal mit
curlauf und senden Sie das Token im Header:
curl -s -H "Authorization: Bearer <secret>" "https://<your-site>/wp-json/as24ci/v1/cron-import"
Ein erfolgreicher Durchlauf gibt eine JSON-Antwort zurück, die das Importergebnis beschreibt. Ein 403-Fehler mit "Invalid or missing token" bedeutet, dass der Header oder das Token fehlerhaft kopiert wurde.
- Überprüfen Sie den nächsten geplanten Durchlauf. Warten Sie auf den nächsten geplanten Cron-Takt, öffnen Sie dann Car Market Hub → System & Help und vergewissern Sie sich, dass Letzter externer Cron-Lauf einen aktuellen Zeitstempel anzeigt.
Veraltete Query-String-Authentifizierung (nicht empfohlen)
Aus Gründen der Abwärtskompatibilität akzeptiert der Endpunkt das Token weiterhin als Query-Parameter in der Form …/wp-json/as24ci/v1/cron-import?token=<secret>:
*/15 * * * * curl -s "https://<your-site>/wp-json/as24ci/v1/cron-import?token=<secret>" > /dev/null
Diese Methode ist veraltet, da das Secret in der URL übertragen wird, wo es in den Zugriffsprotokollen von Servern, Proxys und CDNs aufgezeichnet wird (und in Prozesslisten sichtbar ist). Bestehende Cronjobs, die diese Methode nutzen, funktionieren weiterhin, aber bevorzugen Sie den Header Authorization: Bearer für neue Einrichtungen und migrieren Sie ältere Jobs bei Gelegenheit.
Konfigurationsreferenz
Die Einstellungen, die den Server-Cron-Modus betreffen, befinden sich unter Car Market Hub → Import & Limits (Karte "Automatisierung").
| Einstellung | Zweck |
|---|---|
| Cron-Modus | Wechselt zwischen WP-Cron und Server-Cron. Im Server-Cron-Modus ist der WP-Cron-Zeitplan deaktiviert und die Karte Server-Cron-Einrichtung wird angezeigt. |
| REST-Trigger-URL | Die URL, die der Server-Cronjob aufrufen soll: …/wp-json/as24ci/v1/cron-import. Sie enthält kein Secret, sodass sie sicher in Skripten und Protokollen aufbewahrt werden kann. Generiert aus der aktuellen Website-URL. |
| Authentifizierungs-Header | Der Header Authorization: Bearer <token>, der das Secret an den Endpunkt überträgt. Das Token wird nach dem Generieren/Neugenerieren nur einmal (ca. 15 Minuten) angezeigt; im Ruhezustand wird nur ein Einweg-Hash aufbewahrt. Verwenden Sie die Schaltfläche Token neu generieren, um ein neues auszustellen (bestehende Cronjobs müssen dann mit dem neuen Header aktualisiert werden). |
| Beispiel-Cron-Befehle | Vorausgefüllte Beispielbefehle, die die aktuelle Trigger-URL und den absoluten Pfad zu wp-cron.php verwenden. Verwenden Sie die Kopieren-Schaltflächen, um sie wortgetreu zu kopieren. |
| Max. Fahrzeuge pro Cron-Lauf | Begrenzt, wie viele Fahrzeuge ein einzelner Importlauf verarbeitet. 0 bedeutet unbegrenzt. Nützlich als Sicherheitsgrenze auf Shared-Hosting-Systemen. |
| Bildwarteschlangen-Modus | Wenn 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_CRONzuwp-config.phpvervollstä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 Cronjob überschneidet, wird der zweite Durchlauf abgebrochen.
- Vertraulichkeit des Tokens. Das Cron-Token berechtigt zum Auslösen eines Imports. Behandeln Sie es als Geheimnis und senden Sie es im Header
Authorization: Bearerstatt in der URL, damit es niemals in Zugriffsprotokollen landet. Vermeiden Sie es, den Header (oder eine veraltetetoken=...-URL) in Screenshots oder Tickets einzufügen; machen Sie das Geheimnis unkenntlich, bevor Sie es teilen. - Token-Rotation. Verwenden Sie Token neu generieren, wann immer Sie vermuten, dass das Token offengelegt wurde, oder im Rahmen einer regelmässigen Rotation. Aktualisieren Sie nach der Neugenerierung jeden Cronjob, der die URL verwendet – die vorherige URL wird abgewiesen.
- Speicherort des Endpunkts. Der REST-Endpunkt ist die standardmässige 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 Cronjob entsprechend. - Externer Heartbeat. Jede Anfrage an die Website, die
?as24ci_cron=1enthält, zeichnet einen Zeitstempel auf, den die Registerkarte "System & Help" verwendet, um zu bestätigen, dass ein externer Scheduler aktiv ist. Dies dient rein der Information und löst selbst keinen Import aus. - Begleitjob für die Bildwarteschlange. Wenn Bilder während geplanter Importe in die Warteschlange eingereiht werden, wird die Warteschlange durch die Aufgabenwarteschlange von WordPress verarbeitet. Wenn Sie WP-Cron deaktiviert haben, sorgt der zweite Cronjob, der
wp-cron.phpaufruft, dafür, dass diese Warteschlange in Bewegung bleibt. - Verlassen Sie sich nicht auf browserbasiertes Testen. 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.
Betriebsprüfungen nach der Einrichtung
Gehen Sie diese Prüfungen einmal nach dem Wechsel in den Server-Cron-Modus und erneut nach jeder grösseren Änderung (Host-Migration, URL-Änderung, Token-Regenerierung) durch:
- Cron-Dienst ist aktiviert. Bestätigen Sie, dass der Cron-Dienst des Hosts aktiv ist und dass das Benutzerkonto, das den Job ausführt, die Berechtigung zur Ausführung des Befehls besitzt.
- Geplanter Befehl ist korrekt. Der Zeitplanausdruck entspricht der gewünschten Häufigkeit, die URL stimmt mit dem auf der Automatisierungskarte angezeigten Wert überein und der zweite Job, der
wp-cron.phpaufruft, existiert. DISABLE_WP_CRONist definiert. Die Registerkarte «System & Hilfe» bestätigt, dass die Konstante gesetzt ist, wenn Sie sich im Server-Cron-Modus befinden.- Letzter externer Cron-Lauf ist aktuell. Die Registerkarte «System & Hilfe» zeigt einen Zeitstempel für den Letzten externen Cron-Lauf innerhalb des erwarteten Intervalls.
- Letzter Importlauf ist aktuell. Das Dashboard-Widget und die Registerkarte «System & Hilfe» zeigen aktuelle Aktivitäten des Importers.
- Protokolle zeigen keine wiederholten Authentifizierungsfehler. Ein Muster von 403-Antworten in den Protokollen bedeutet, dass der Cron-Job ein veraltetes oder falsches Token verwendet.
- Bildwarteschlange wird abgearbeitet. Die Registerkarte «Import & Limits» zeigt, dass die Bildwarteschlange verarbeitet wird (oder leer ist).
- 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
| Symptom | Wahrscheinliche Ursache | Was zu prüfen ist |
|---|---|---|
| Cron-Job läuft, aber die Antwort ist 403 mit «Invalid or missing token». | Das Token im Header Authorization (oder im veralteten Parameter token=) ist falsch, enthält Leerzeichen oder wurde nach der Erstellung des Cron-Jobs neu generiert. | Kopieren Sie den Authentifizierungs-Header erneut von der Karte «Server-Cron-Einrichtung» und aktualisieren Sie den Cron-Befehl. |
| 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. |
| Cron-Job läuft erfolgreich, aber die Registerkarte «System & Hilfe» zeigt immer noch keinen aktuellen externen Lauf an. | Der Cron-Dienst ruft einen anderen Host auf (z. B. HTTP statt HTTPS oder www. statt des kanonischen Hostnamens) 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 es erscheinen keine Bildanhänge mehr. | DISABLE_WP_CRON ist gesetzt, aber kein Cron-Job ruft wp-cron.php auf, sodass der Worker für die Bildwarteschlange nie ausgeführt wird. | Fügen Sie den zweiten Cron-Job für wp-cron.php wie oben beschrieben hinzu. |
| Importe laufen zu lange oder stossen an ein Speicherlimit. | Die PHP-CLI-Limits des Hosts sind strenger als erwartet. | Reduzieren Sie Max. Fahrzeuge pro Cron-Lauf, lassen Sie den Modus für die Bildwarteschlange aktiviert und lesen Sie Cron und Hintergrundverarbeitung. |
| Importe laufen zweimal kurz hintereinander. | 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. |
| Cron-Job läuft, gibt aber immer «Another import is already running» zurück. | Ein vorheriger Lauf 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 Lauf anhand der Plugin-Protokolle. Siehe Cron-Fehler. |