Kleine Hilfe, Bitte ... verifizieren eines Verhaltens

Hi, ich verfüge leider nur über „veraltete“ IPS-Systeme und möchte Benutzer neuerer Systeme bitten, mir einen kleinen Gefallen zu tun (max 5 min Zeitaufwand):

In meiner Version führt ein (Timer-) Event, das direkt unter einer Kategorie (also NICHT unter einem Script) hängt zum AUSFÜHREN der autoappend UND autoprepend, obwohl es ja genau genommen nix auszuführen gibt.

Enstprechend ist [‚SELF‘] in $_IPS nicht existent - was man aber typischerweise bei Ausführung der autoappend Datei erwarten würde.

Könnte das für mich bitte jemand verifizieren, ob es auch bei neueren Versionen (4++) noch so ist?

Vorgehen ist simpel:

1.) Anlegen eines Timers mit z.B. täglicher Ausführung (unbefristet), einmalig und in wenigen Minuten.

2.) in der „autoappend“ die Zeile "print_r( $_IPS ); " einfügen.

3.) Timerausführung abwarten und das Log im Auge halten.

Bei mir sieht das dann so aus:

02.05.2023 18:58:00.014 |     0 | DEBUG   | ExecuteThreadID #12  | Skriptausführung (Text) - Länge: 0 ~ Absender: Ereignis #56404, Zeit Ereignis
02.05.2023 18:58:00.073 |     0 | MESSAGE | ExecuteThreadID #12  | [Kein(e)] = Array
(
    [SENDER] => TimerEvent
    [EVENT] => 56404
    [TARGET] => 16503
    [THREAD] => 12
)

02.05.2023 18:58:00.073 |     0 | DEBUG   | ExecuteThreadID #12  | Ausgeführt, Resultat: 1, Erfolgreich: True, Zeit: 3 ms

1000 Dank im Voraus

Ich glaub es ist am einfachsten, wenn du es z.B. mit einem Docker Container schnell selber testest :slight_smile:

paresy

Ich verfüge leider nicht über eine neuere Version von IPS. Sonst hätte ich das - klar - mal eben probiert.

Wobei Ihr als Entwickler das ja sowieso wissen müßtet … Sinn macht’s ja mal nicht, ein „nicht vorhandenes“ Script überhauot laufen zu lassen … m.M.

Mittlerweile gibt es eine Demo-Version :slight_smile:

Du kannst z.B. die Docker Version einfach ohne Lizenz zeitbeschränkt starten. Bei Windows brauchst du eine Demo Lizenz die du anfordern kannst.

paresy

Danke. Ich will mir die Demo-Anforderung gerne aufheben für die Tage, wenn mein Klassensystem für IoT basierte Systeme fertig sein wird, um das dann auch intensiv zu testen vor Release. Sicher kann ich ja nicht mehrere Demos bekommen … und mit irgendwelchen e-mail Adressen jonglieren will ich auch nicht.

Da mein Anliegen für jemand mit Installation ja nun wirklich kein großer Act ist - wie schon geschrieben, für jemand mit ein bissl IPS-Kenntnisse handelt es sich bestenfalls um Minuten - hoffte ich auf Hilfe. Habe ja meine Tutorials auch schon -zig Leuten kostenlos zur Verfügung gestellt.

Ich werd’ mal gezielt nachfragen.

Hi,
hab keine Ahnung was autoappend sein soll, im Event unter „Führere PHP Code aus“ habe ich aber mal das Print_r gesetzt:

image

Mit „autoappend“ kann ich nix anfangen. Sonst würde ich helfen.

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.

uups leider vertippt … …

In der 6.3 gibt es keine autoappend Datei und der Eintrag ist in der php.ini auch nicht vorhanden.

die „append“ war auch in der alten IPS Version NICHT gesetzt und benutzt, nur die auto_prepend_file-Direktrive war genutzt .

Es ist auch egal, wo der Test [ print_r( $_IPS) ] vorgenommen wird, es geht darum, ob IPS nach wie vor „Geisterscripte“ laufen läßt im Falle des Falls, dass ein Event (hier: Timer) auslöst und nicht Child eines Scripts ist und dann $_IPS[‚SELF‘] nicht gesetzt ist (oder vlt. leer bleibt oder gar sonstigen Unfug beinhaltet).

Ereignisse, die Scripte starten gibt es in neuen Versionen nicht mehr. Stattdessen wird eine Aktion gestartet, die im Sonderfall - wenn es unter einem Script hängt - (Kompatibilität zur Vergangenheit) auch ein Script sein kann.

Er kann aber unter Kategorien die „Führe PHP Skript“ Aktion nutzen. Ist evtl. ähnlich und sollte auch das autoappend triggern, wenn es gesetzt ist.

paresy