CronEvents (funktioniert ab 1.15)

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

CronEvents (funktioniert ab 1.15)

Beitrag von Megger » 14.06.2012, 12:38:48

Hi

Wollte hier mal meine Erweiterung vorstellen :D

Was kann diese Erweiterung?
Die Erweiterung basiert auf der Eventhandler-Implementierung von Screeze, läuft aber absolut eigenständig (habe mir nur ein paar Ideen abgeschaut)! Außerdem ist meine Erweiterung dafür gedacht Events per Cronjob abzuarbeiten! Die entsprechenden Events werden in der Datenbank gespeichert! Die Erweiterung wird über Konfigurationsdateien gesteuert!

Wie funktioniert das ganze?
Die Erweiterung besteht aus mehreren Teilen
CronDispatcher
CronManager
CronWorker
CronEvent
CronApplication

Der CronDispatcher kümmert sich um das registrieren der Handler, speichert Events in der Datenbank und wird über einen Cronjob gestartet um sich um entsprechende Worker zu kümmern, die die Events abarbeiten

Der CronManager ist sozusagen eine Zwischenschicht, dieser kümmert sich um das Auslesen der Configuration und stellt eine GORM Instanz zur Verfügung und beendet auch die entsprechende Datenbankverbindung wenn diese nicht mehr gebraucht wird.

CronWorker wird vom Dispatcher gestartet und kümmert sich um die Abarbeitung der Events, dabei hat jeder Worker einen entsprechenden Prioritätenbereich! Umso höher die Priorität, desto kleiner dieser Bereich.
Beispiel: maxPrio = 100
1. CronWorker -> Prio 100 - 100
2. CronWorker -> Prio 99 - 98
3. CronWorker -> Prio 97 - 94
4. CronWorker -> Prio 93 - 85
usw.

Ein CronEvent wird vom CronDispatcher entgegengenommen

CronApplication dient zur Unterscheidung verschiedener Applications

Um die Abarbeitung per Cronjob zu ermöglichen, wird eine entsprechende php Datei angelegt, welche per Cronjob aufgerufen wird, z.B. cron.php:

Code: Alles auswählen

require_once 'apps/core/pagecontroller/pagecontroller.php';
import('extensions::cronevents::biz', 'CronDispatcher');
import('core::logging', 'Logger');

// Set logdir, cause of differents between the enviroment of cron and php
Registry::register('apf::core', 'LogDir', '/var/www/logs');
/**
 * @var Logger $logger
 * Please log everything
 */
$logger = Singleton::getInstance('Logger');
$logger->setLogThreshold(Logger::$LOGGER_THRESHOLD_ALL);

$cronDispatcher = new CronDispatcher();
$cronDispatcher->setContext('<yourContext>');
$cronDispatcher->start();
 
Dadurch wird die Abarbeitung gestartet, der CronDispatcher kümmert sich nun darum, dass entsprechend der Konfiguration genügend CronWorker laufend die CronEvents abarbeiten

Wie konfiguriere ich diese Erweiterung?
Es gibt mehrere Konfigurationsdateien:
/config/extensions/cronevents/biz/EXAMPLE_croneventsconfig.ini

Code: Alles auswählen

[default]
db.connection = "PDO"
application.id = 1
dispatcher.sleep = 1
worker.maxPrio = 100
worker.amount = 30
worker.events = 15
'db.connection' Welche Datenbankverbindung soll genutzt werden, dies ist wichtig, da die einzelnen CronWorker ihre eigene Verbindung brauchen
'application.id' Unter welcher CronApplication soll alles gespeichert werden
'dispatcher.sleep' Wielange soll der Dispatcher schlafen, bevor er überprüft ob CronWorker fertig sind und neue gestartet werden können
'worker.maxPrio' Die maximale Priorität die ein CronEvent haben kann
'worker.amount' Wieviele CronWorker sollen gleichzeitig laufen. Zusammen mit maxPrio definiert dies die Verteilung der Prioritäten zwischen den CronWorkern
'worker.events' Wieviele Events soll ein CronWorker abarbeiten?

VORSICHT: Man sollte es nicht mit der Anzahl der Worker übertreiben, da jeder Worker eine eigene Verbindung zur Datenbank aufbaut (15 Worker = 16 - 17 Datenbankverbindung (jeder Worker + 2 fürn Dispatcher)

/config/extensions/cronevents/biz/EXAMPLE_serviceobjects.ini
Damit man die entsprechenden Objekte per DIServiceManager beziehen kann.

/config/extensions/cronevents/data/EXAMPLE_cronevents_domainobjects.ini
/config/extensions/cronevents/data/EXAMPLE_cronevents_objects.ini
/config/extensions/cronevents/data/EXAMPLE_cronevents_relations.ini
Alle drei für den GORM! Die entsprechenden Tabellen kann man mit dem GORMSetupTool bzw. GORMUpdateTool in der Datenbank erstellen

/config/extensions/cronevents/data/EXAMPLE_loadPreviousEventList.sql
Lädt Events innerhalb des CronWorkers die erstellt wurden, bevor ein CronHandler registriert wurde (kann man beim registrieren eines CronHandlers einstellen, ob vorher vorhandene Events abgearbeitet werden sollen oder nicht)

Wie registriere ich CronHandler und löse CronEvents aus?
Über den CronDispatcher können CronHandler registriert und entsprechende CronEvents ausgelöst werden

Code: Alles auswählen

// Get the CronDispatcher
$cronDispatcher = $this->getDIServiceObject('extensions::cronevents::biz', 'cronDispatcher');

// Register a CronHandler
$cronDispatcher->addHandler('namespace::of::the::handler', 'CronHandler', 'handleEvent'); //CronHandler handles all Events with the method 'handleEvent'

// Register a CronHandler
$cronDispatcher->addHandler('namespace::of::the::handler', 'CronHandler', 'handleEvent', 'specialEvent'); //CronHandler handles only Events with name 'specialEvent' with the method 'handleEvent'

// Trigger a event
$cronEvent = new CronEvent('specialEvent', 'info', 'value', 50); // Create a event with name 'specialEvent', 'info' as info, 'value' as additional Value and '50' as priority
$cronDispatcher->triggerEvent($cronEvent); // Trigger the event
 
Ich hoffe ich habe nichts vergessen :D
Die Erweiterung liegt entsprechend unter /extensions/cronevents

HINWEIS: Sollte pcntl_fork nicht funktionieren, so wird eine Warnung geloggt, dass nur 1 CronWorker gestartet wird und der CronDispatcher auf den CronWorker warten muss, dadurch geht der ganze Vorteil dieser Erweiterung verloren

Bei Fragen einfach melden
Dateianhänge
cronevents.zip
(19.41 KiB) 61-mal heruntergeladen
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: CronEvents

Beitrag von dave » 14.06.2012, 13:08:30

Megger, du bist mein Held! ;)

Gestern habe ich mich erst noch ein wenig geärgert, weil ich ne ganze Weile gebraucht habe, um eine Indexierung von Produkten für eine Suche via cron zu starten. Und heute haust du diese Erweiterung raus. Hammer!

Ich hoffe, ich finde am Wochenende Zeit, das zu testen. Bin schon gespannt, was mich erwartet. Feedback gibts in gewohnter Weise hier im Forum!

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: CronEvents

Beitrag von Megger » 14.06.2012, 13:47:32

Habe den obigen Beitrag noch ein wenig editiert und noch ein kleines Vorsicht und einen Hinweis hinzugefügt ;-)

Baue schon eine ganze Weile an dieser Erweiterung, inzwischen aber einiges getestet und für gut befunden! Allerdings noch nicht im Produktiven Einsatz, da der Umbau dann doch etwas größer ist, da es mehrere verschiedene Systeme betrifft, die sich per SOAP synchronisieren!

Habe bei meinem bisherigen System immer das Problem gehabt, dass ein Event mit geringerer Priorität den Eventhandler für längere Zeit blockiert hat, sodass andere Events sich 'gestaut' haben! Das Problem habe ich durch die verschiedenen Worker gelöst, die einen bestimmten Priobereich abdecken! (Allerdings habe ich die Befürchtung, dass dieses System so schnell arbeitet, dass ich die SOAP Requests zentral abarbeiten sollte (und wahrscheinlich auch zusammenfassen) sodass ich nicht meine eigenen Server ins Nirvana requeste :D)

Bin schon sehr auf dein Feedback gespannt!
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dr.e. » 14.06.2012, 22:20:28

Hallo Tobi,

schöne Arbeit, gefällt mir! Wirst du die Extension in das APF-SVN integrieren?
Viele Grüße,
Christian

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Megger » 14.06.2012, 22:34:45

Ja werde ich, allerdings wollte ich vorher noch eine grafische Ausgabe bauen, sodass man sehen kann, welche Worker gerade laufen usw. Außerdem wollte ich noch ein paar andere Meinungen hören, sodass ich vielleicht vorher noch ein paar Änderungen einbauen kann
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Coach83 » 15.06.2012, 05:25:16

Ich kanns zwar aktuell noch nicht gebrauchen, werde den Import von meinen Fußballergebnissen aber darauf aufbauen. Sieht nach ner super Arbeit aus:-)

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Megger » 15.06.2012, 12:31:41

Ich freue mich schon auf das Feedback :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dave » 18.06.2012, 12:37:04

Hi Megger,

ich habe mich schonmal ein wenig mit der Erweiterung auseinander gesetzt. Wa sich bisher noch nicht verstanden habe:

Wenn ich mit folgender cron.php alles anstosse:

Code: Alles auswählen

require_once 'apps/core/pagecontroller/pagecontroller.php';
import('extensions::cronevents::biz', 'CronDispatcher');

$cronDispatcher = new CronDispatcher();
$cronDispatcher->setContext('projectone');
$cronDispatcher->start();
 
Welche Jobs werden denn nun genau abgearbeitet oder wie kann ich das konfigurieren?

Bei meinem Server-Provider wird für Cronjobs verlangt, dass ich den Interpreter ("shebang") ganz zu Anfang definiere, damit der Server dann weiss, wie er den Job zu verarbeiten hat. Beispiele:

Code: Alles auswählen

#!/usr/bin/php oder
#!/usr/bin/perl
Da es sich ja grundsätzlich immer um PHP handelt, könnte man das ja dirket zu anfang mit ausgeben. Nur das benötigt möglicherweise gar nicht jeder Anwender.

Und: Ich muss innerhalb meiner Skripte absolute Pfade, die auf meine Paketnummer verweisen, verwenden. Beispiel:

Code: Alles auswählen

 /is/htdocs/wp10589425_464Wxxxxxx/
Somit sähe es bei mir dann so aus:

Code: Alles auswählen

require_once '/is/htdocs/wp10589425_464Wxxxxxx/www/nahrungsmittelvergleich.de/beta/apps/core/pagecontroller/pagecontroller.php';
import('extensions::cronevents::biz', 'CronDispatcher');

$cronDispatcher = new CronDispatcher();
$cronDispatcher->setContext('projectone');
$cronDispatcher->start();
 
Vielleicht sollte sowas in eine Config ausgelagert werden?

Bin auf die Anregung gespannt, wie ich das ganze einsetzen kann. Ich bin eben Anfänger und brauche ein Beispiel, andem ich arbeiten kann ;). Wie im anderen Thread, den ich heute erstellt ahbe, schon erwähnt, kann ich durch meine kurzfristige Reise ins wunderbare Land Bayern und die tolle Stadt München frühestens Samstag wieder reagieren.

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Megger » 18.06.2012, 13:11:03

Welche Jobs werden denn nun genau abgearbeitet oder wie kann ich das konfigurieren?
Gar keine! Du musst erst einen Handler registrieren (CronDispatcher->addHandler(...)) damit die verschiedenen "Jobs" abgearbeitet werden! Dadurch definierst du, welche "Jobs" von welchem Handler übernommen werden!
Du musst die entsprechende Logik hinterlegen, dafür bekommst du als Parameter ein CronEvent Objekt
Das habe ich wohl vergessen in meinem Eingangspost aufzuführen, deswegen ist es auch erstmal so veröffentlicht und nicht direkt im SVN! Dient mir auch dazu erstmal Informationen zu sammeln, was man alles in der Dokumentation berücksichtigen muss!
Da es sich ja grundsätzlich immer um PHP handelt, könnte man das ja dirket zu anfang mit ausgeben. Nur das benötigt möglicherweise gar nicht jeder Anwender.
Sicherlich interessant, bei mir ist es allerdings so, dass ich in der crontab bereits angebe, dass sich PHP darum kümmern soll, deswegen benötigt es kein "shebang"! Ich denke in der Hinsicht gibt es zuviele Unterschiede zwischen den Anbietern! Ich kann sicherlich Beispiele in der Dokumentation liefern, wie diese "cron.php" aussehen könnte, allerdings keine genaue Implementierung für jeden Anbieter zeigen! Außerdem kann es ja sein, dass man noch andere Dinge einbauen will (siehe meine Log Angaben, was ich dir auch empfehlen würde, besonders das log_dir, damit weißt du zumindestens wo deine Log Dateien sind)
Vielleicht sollte sowas in eine Config ausgelagert werden?
Die Frage verstehe ich nicht so ganz, was soll in die Log Datei ausgelagert werden? Der Pfad? Den brauchst du nur bei der Einbindung vom Pagecontroller, danach kümmert sich doch das APF darum!
kann ich durch meine kurzfristige Reise ins wunderbare Land Bayern und die tolle Stadt München
Viel Spaß hier in Bayern :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dr.e. » 18.06.2012, 21:22:15

Reise ins wunderbare Land Bayern und die tolle Stadt München
Das war doch nicht etwa ironisch gemeint? ;)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dave » 23.06.2012, 11:43:27

dr.e. hat geschrieben:Das war doch nicht etwa ironisch gemeint? ;)
Nein, niemals. München ist wirklich fantastisch! Jedes mal (war das zweite mal nun), wenn ich in München bin, bin ich von der Atmosphäre, die dort herrscht und der Stadt selbst total begeistert. Schade nur, das ich berufllich dort unterwegs war ... sonst hätte ich noch mehr gesehen.

Ich werde mich die Tage nochmal mit den cronevents auseinander setzen und dir dann Feedback geben.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4533
Registriert: 04.11.2007, 16:13:53

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dr.e. » 23.06.2012, 17:07:09

Wenn du wieder mal in München bist, lass uns mal auf einen Kaffee treffen.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: CronEvents (funktioniert ab 1.15)

Beitrag von dave » 24.06.2012, 14:04:38

Sehr gerne!

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Megger » 28.06.2012, 13:48:30

Inzwischen schon Erfahrungen vorhanden? :D
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: CronEvents (funktioniert ab 1.15)

Beitrag von Coach83 » 29.06.2012, 09:54:45

Großes Kompliment an Megger - die Extension funktioniert und der Support ist hervorragend!

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast