Wollte hier mal meine Erweiterung vorstellen

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();
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
'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

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