Plugins im laufendem Betrieb austauschen
21. August 2007 – 15:42Verfasst am 20. August 2007 im Dachboden
08:35 Uhr
Ich bin gerade dabei, mein Bot-Framework weiterzuentwickeln und bin bei einem Punkt stecken geblieben: Wie kann ich das Plugin-System besser machen?
Bisher wurden die Plugins beim Start des Bots geladen und weitere hätte man ohne Probleme laden können. Zwei Dinge haben mir aber noch gefehlt: Updaten von Plugins im Betrieb und beenden dieser.
Das Beenden habe ich nun mit der magischen Methode __destruct und einem neuen Controller für die Plugins realisiert, jedoch hat mir das andere einiges an Kopfzerbrechen bereitet. Alle Plugins sind als Klassen deklariert, es ist jedoch unter PHP nicht möglich, in laufenden Skripts definierte Klasse zu verändern oder zu löschen.
Nach einigem Grübeln kam mir dann ein Einfall. Wieso nicht einfach die Klassen dynamisch bauen lassen?
Nach vielen Tests und Umgeschriebe an den Plugins war es nun so weit: Die Klassen werden nun erzeugt, indem ich die Definition (class name_id) mit einer Vorlage aus einer Plugin-Datei zusammensetzte. Nun kann ich einfach Änderungen an den Dateien vornehmen und im Betrieb Plugins austauschen, da jede Version eine eindeutige ID bekommt. Es wäre jetzt sogar möglich, mehrere Versionen eines Plugins gleichzeitig laufen zu lassen, macht jedoch wenig Sinn
Ich habe beim Testen auch einen merkwürdigen Bug bei PHP gefunden: Wenn ich in einer auskommentierten Zeile ein ?> stehen hatte, bekam ich immer Fehlermeldungen wie diese:
Parse error: syntax error, unexpected $end in K:\Work\php_cli\bot\lib\PluginController.class.php on line 73
10:12 Uhr
Nach viel Debugging hab ich endlich die Reloadfunktion für Plugins fertig gestellt, da PHP gerne bei __destruct gerne ein bisschen zickte hab ich einfach eine eigene Funktion namens Unload() genommen die aufgerufen wird, bevor ein Plugin zerstört und durch eine neue Instanz ersetzt wird. Dies ist unter anderem notwenig, um die Handler von SmartIRC zu aktualisieren, da diese sonst auf eine falsche Klasse zeigen würden.
12:35 Uhr
Endlich muss ich nicht mehr den ganzen Bot neu starten, nur wenn mal eine Funktion nicht so arbeitet wie ich will. Einfach “!reloadplugin bla” an den Bot schicken und schon geht’s weiter mit entwickeln. Zuvor musste ich immer n halben Meter mit’m Stuhl an meinen anderen PC rutschen auf dem der Bot läuft. Das geht selbst mit dem ReloadPlugin-Plugin einwandfrei. ![]()