Für alle, die es interessiert, hier ein wenig „tieferes“:
1.) autoAPPEND / autoPREPEND
PHP hat eine „Hilfestellung“ für Code, der IMMER am Anfang oder am Ende eines Aufrufs ausgeführt werden soll. In IPS also beim Web-Aufruf, per „Ausführen“ oder per Event. Sogar das Webfront hat das - jedes mal und das nicht zu selten - ausgeführt, bei mir alle 3 Sekunden wenn Webfront in einem ein Browser aktiv war.
Im Prinzip wirkt das so, als ob in JEDEM Startscript (also das Script des Aufrufs, NICHT den include-Dateien) ein „include ‚autoprepend.php‘;“ UND am Ende ein „include ‚autoappend.php‘;“ stünde. Nur, dass man sich diesen Aufwand halt sparen kann.
Ein- und Ausgeschaltet wird das in der PHP.INI mit den Direktriven auto_prepend_file= und auto_append_file= (PHP: Liste der php.ini-Direktiven - Manual)
Das ist hilfreich, um z.B. den Errorhandler „umzubiegen“ - das hat IPS in den älteren Versionen (ich habe keine Neue, kann das also nicht prüfen) gemacht. Dort waren auch solche Codezeilen zu finden:
if(file_exists(IPS_GetKernelDir().„\scripts\__compatibility.inc.php“))
require_once(IPS_GetKernelDir().„\scripts\__compatibility.inc.php“);
if(file_exists(IPS_GetKernelDir().„\scripts\__autoload.php“))
require_once(IPS_GetKernelDir().„\scripts\__autoload.php“);
if(file_exists(IPS_GetKernelDir().„\scripts\__ipsmodule.inc.php“))
require_once(IPS_GetKernelDir().„\scripts\__ipsmodule.inc.php“);
if(file_exists(IPS_GetKernelDir().„\scripts\__genmodule.inc.php“))
require_once(IPS_GetKernelDir().„\scripts\__genmodule.inc.php“);
(wobei if(exists) und require_once in dieser Form m.E. quatsch ist, denn der require-Fehler wird ja gerade mit dem if exists umgangen wozu dann require? )
2.) MEIN Problem:
Ich nutze diese beiden Auto-Dateien zum Laden von (m)einem Framework und am Ende wird eine Auto-Routine aufgerufen, die vieles protokolliert:
Klassen, die genutzt wurden, Dateien, die includiert wurden und Funktionen, die aufgerufen wurden und wenn ein Fehler vorkam, wird noch ein spezielles Log ausgegeben.
Ausserdem werden dort Variablen aus dem Cache geladen und ein paar andere Schmackazien (das Framework läuft auch unabhängig von IPS und steuert so IP-basierte Hausautomation).
Nun habe ich bei einer Erweiterung meiner „autoappend“ seltsame Fehler („NULL“ in Arrays) erhalten. Ausschließlich auf einem IPS-System, das ich parallel betreibe - MANCHMAL (dazu gleich mehr) und IMMER NUR wenn in der $_SERVER keine Referenz zur aufgerufenen Datei zu finden war, also wenn IPS der „Auslöser“ war, nicht bei Zugriff per http oder das Webfront.
Meine Nachforschungen haben ergeben, dass in IPS - alte Version - offenbar auch „Geisterscripte“ oder „Nullscripte“ aufgerufen werden, und zwar dann, wenn ein Event ausgelöst wird, dieser Event sich ABER NICHT unter einem Script befindet, sondern (u.a.) ein „Child“ einer Kategorie ist.
(Falls jemand einwendet, das sei Quatsch: Ich verwende das als „Parkplatz für Events“, um Events bei Bedarf „mal eben“ per drag & drop an ein Script zu heften, das geht schneller, als es auszuschalten, es zu löschen und ein neues anzulegen, außerdem bleibt so die ID immer dieselbe, was beim Debugging hilfreich sein kann.)
Und genau in diesem Fall (Event ist Child einer Kategorei) wird DANN (offenbar), wenn das Event ausgelöst wird (z.B. weil es ein täglicher Timer zu einer bestimmten Zeit ist) NUR die Autoprepend UND die Autoappend ausgeführt (ein Script steht ja nicht zur Verfügung), was natürlich, wenn man auf einen (Start-)Scriptnamen zugreifen will, zu einem Fehler führt, denn es gibt kein [‚SELF‘]. Auch der Eintrag im Log ist dann seltsam. Da, wo normalerweise der Scriptname aus dem Objektbaum steht, steht dort dann Kein(e) - siehe meinen Eingangsbeitrag.
Bevor ich nun eigene, größere Anstrenungen unternehme, das auszumerzen, wollte ich gerne wissen, ob dieses Verhalten in neueren IPS-Versionen so auch noch existiert.
3.) HELFEN kann mir jemand, bei dem ein autoprepend und/oder ein autoappend läuft . (Das müßten m.E. fast alle IPS-User sein, denn ich denke, dass auch die neuen Versionen weitrehin mit der Autoprepend ähnlich wie oben beschrieben arbeiten)
Zu tun ist das, was ich oben beschrieben habe. WICHTG: Der Timer-Event DARF NICHT unter einem Script „hängen“, das löst das Script einfach aus und alles ist in Ordnung. BEI MIR in der alten Version kommt der „Fehkler“ sicher unter einer Kategorie. Habe jetzt nicht auch noch andere „nicht-Script-Objekte“ ausprobiert.
Wenn also jemand die Muse hat … 1000 Dank im Voraus.