Cronjob einrichten bei Modulaktivierung

Hallo zusammen,

ist es möglich, ein Modul zu schreiben, welches bei Aktivierung einen Cronjob einrichtet und startet? (um in regelmäßigen Abständen eine PHP-Funktion auszuführen)

Ein systemweiter Cronjob kommt vermutlich nicht in Frage, wegen dem fehlenden Zugriff auf das Dateisystem? Eine kurze Recherche brachte das Ergebnis, das dies mit Oxid nicht möglich sei.

Allerdings sprechen Dateien wie die bestitamazoncron.php des Moduls bestit\amazonpay4oxid eine andere Sprache. Verstehe den Source noch nicht ganz, aber das sieht für mich schwer nach genauso dem aus, was ich vorhabe.

Kenne mich mit der Thematik noch nicht allzu gut aus und möchte daher erstmal die Frage klären, ob das grundsätzlich denn überhaupt möglich ist, bevor ich zahllose Stunden in’s Einarbeiten investiere.

Sicher. Es gibt dazu sehr viele Beispiele.

1 Like

Alles klar, danke für die schnelle Aufklärung!

Dachte ich mir schon, war nur etwas verunsichert wegen dem verlinkten Thread. Die Info scheint wohl veraltet zu sein.

Morgen zusammen,

zu dem Thema sind doch noch ein paar Unklarheiten aufgetreten, die ich durch Recherche nicht so recht auflösen konnte. Ich hoffe, es ist in Ordnung, wenn ich dafür auf diesen Thread zurückgreife.


Also so habe ich das Ganze nun verstanden. Bitte korrigiert mich, wenn ich falsch liege:
Oxid legt bei der initialen Shop-Installation einen zentralen Cronjob im System an, der regelmäßig die Datei /source/bin/cron.php aufruft, welche u.a. das Wartungsskript Maintenance::execute() anstößt.

Möchte man nun zusätzlich ein eigenes Skript regelmäßig aufrufen, hat man zwei Möglichkeiten:

  1. Man klinkt sich in den vorhandenen Cronjob ein, indem man den Aufruf des eigenen Skripts entweder direkt in die cron.php einträgt (updatesicher? aus eigenem Modul?) oder man erweitert die Klasse Maintenance und überladet ihre Methode execute() mit dem eigenen Skript (definitiv updatesicher und aus eigenem Modul möglich).

  2. Man schreibt ein Modul mit einem Controller, welcher das regelmäßig aufzuführende Skript enthält. Die URL zu diesem Controller (www.shopdomain.de/source/index.php?cl=xxx&fnc=yyy bzw localhost/source/index.php?cl=xxx&fnc=yyy) wird in einem Cronjob angegeben, welcher von Hand (Windows: Aufgabenplanung, Linux: crontab -e) angelegt werden muss. Eine Automatisierung dieses Prozesses im onActivate()-Event des Moduls ist nicht ohne weiteres möglich.

Der Vorteil von Methode 1 ist, das man die Funktion vollständig in ein Modul verpacken kann, sodass der Nutzer nicht noch selber aktiv werden muss (Cronjob anlegen), sondern einfach nur das Modul aktivieren muss.
Der Nachteil dieser Methode ist, dass das Aufrufintervall nicht verändert werden kann.


→ Bezogen auf mein angeachtes Modul, welches die Tabellen einer zweiten Datenbank auf dem Server mit den OxidDB-Tabellen oxuser & oxnewssubscribed synchronisieren soll, wäre es demnach sinnvoller und aus ausreichend, wenn ich einfach die Maintenance->execute() überschreibe und im onActivate() sicherstelle, das die Config-Variable blUseCron auf true steht, damit das Skript auch aufgerufen wird.

  1. Wenn ich mir den Code angucke, dann wird cron.php Datei gar nicht mehr aufgerufen und die Ausführung der Maintenance Tasks erfolgt über die ShopControl Klasse

  2. Wäre mein Ansatz keine alten Implementationen als Vorlagen zu nehmen, sondern versuchen sich am Symfony Framework zu orientieren

Ich würde mir das Thema Events in der Dokumentation General information — OXID eShop developer documentation 6.3.0 documentation angucken.

Im Zweifel kannst Dich mit Deinem Modul die Maintenance Klasse erweitern, diese sollte immer ausgeführt werden wenn der Shop aufgerufen.

Für einen Cronjob welcher eine Wichtigkeit besitzt würde ich immer losgelöst vom System als separates PHP-Skript anlegen und über den Webserver konfigurieren um ihn regelmäßig in bestimmten Zeitabständen ausführen zu lassen.

Man kann mit Modulen nicht alle Probleme löse.

1 Like

Die ShopControl.php sieht ja sehr interessant aus. Schätze, dann bleibt mir tatsächlich keine andere Wahl, als mich für meine Sync-Funktion in die Maintenance einzuklinken. Alles andere wäre wohl wie mit Kanonen auf Spatzen zu schießen.
Schade, dass es in Oxid nicht ohne weiteres möglich ist, Cronjobs direkt aus Modulen heraus automatisch anzulegen. Immerhin sind die ja sehr verbreitet.

Danke für die schnelle Antwort!

Glaube Du musst hier zwischen Cronjob und Event unterscheiden.

Cronjobs laufen auf dem Server, damit hat das Shop-System der OXID eShop wenig mit zu tun. Die Webserver die um Einsatz kommen unterscheiden sich auch extrem in Ihren Konfigurationen - dies unmöglich dies Allgemeingültig abzudecken.

Events werden angetriggert wenn irgendwas auf Webseite passiert und dort bietet OXID eShop Shop-System bereits wie in Dokumentation gesehen Möglichkeiten wie man eigene Events anlegt.

Gerne doch.