PHP Information läuft voll mit require_once aufrufen

Ich habe folgendes schon mal unterModules geschildert aber keine richtige Antwort bekommen.

Wenn man sich mal eine Weile die PHP Informationen anschaut fällt auf dass mehrmals in der Minute und in unregelmäßigen Abständen die Threads mit requre_once Aufrufen voll laufen. Am häufigsten sind es …bumaas…HM_Inventory und …Blind_controll Aufrufe.

Es gibt zwar keine Probleme damit aber ist schon ungewöhnlich zumal z.B. HM_Inventory nicht mal ausgeführt wird (Interval=0)
Vielleicht hat ja hier einer eine Erklärung.

Du könntest mal versuchen, die in require_once genannte Datei mal umzubenennen.
Dann wäre interessant zu sehen, wer sich beschwert …

Ich habe mal die module.php umbenannt.

10.05.2020, 10:51:15 | FlowHandler | Kann Daten nicht zur Instanz #55898 weiterleiten: <br />
<b>Warning</b>: require_once(C:\ProgramData\Symcon\modules.store\bumaas.1\HM_Inventory\module.php): failed to open stream: No such file or directory in <b>C:\Windows\System32-</b> on line <b>2</b><br />
<br />
<b>Fatal error</b>: require_once(): Failed opening required ‚C:\ProgramData\Symcon\modules.store\bumaas.1\HM_Inventory\module.php‘ (include_path=’.:C:\ProgramData\Symcon\scripts’) in <b>C:\Windows\System32-</b> on line <b>2</b><br />

#55898 ist der HM Inventory Report Creator

Ob es daran liegt, dass sich das Modul für die Kernel Messages registriert hat?

        $this->RegisterMessage(0, IPS_KERNELMESSAGE);

Eher wohl weil es sich an den Datenfluss hängt.
Aber da sollte eigentlich nichts passieren, weil du ja gar keine ReceiveData Methode deklariert hast.
Außer das hier intern etwas geändert wurde und diese Methode immer in der ipsmodule Klasse existiert.
Dann reicht es wenn du einen ReceiveDataFilter setzt, welche nie zutrifft.
Michael

Es passiert auch nichts. Zumindest wird von meinen Modulmethoden keine aufgerufen.
Aber es sieht ungesund und systembelastend aus.

Wenn das Modul am Datenfluss hängt, wird ReceiveData aufgerufen. Egal, ob dein Modul diese überschreibt oder nicht. Da muss, wie Nall Chan schon sagte, einfach ein ungültiger ReceiveFilter gesetzt werden.

paresy

Verstehe. Ich lerne immer an der Doku und an Beispielen. Bislang ist mir noch nirgends ein ungültiger Receive Filter aufgefallen. Daher ist das neu für mich und vielleicht für andere auch.

Da werde ich wohl alle meine Module mal überprüfen müssen.

Ein Beispiel/Hinweis in der Doku wäre sicherlich nicht schlecht.

Würde es ein UnregisterMessage nach einem KR_READY auch tun, wenn man nur auf den KR_READY warten will?

Tatsächlich hat dies nichts miteinander zu tun. RegisterMessage ist der MessageSink. Der wird bei deinem Beispiel fast nie aufgerufen.

Das Problem ist ReceiveData und somit der Datenfluss der vom HMSocket befeuert wird. Der Filter limitiert die Datenpakete auf nur die, die du wirklich brauchst. Per default empfängt man aber alles.

paresy

Mir war das auch so nie bewusst.
Allerdings hatte ich schon immer einen Filter gesetzt.

Vielleicht auch, weil es mir damals beim testen aufgefallen ist und ich habe es nur vergessen. Teilweise brauche ich ja auch wirklich Daten vom Datenfluss.
Michael

Dann habe ich es jetzt erst verstanden. Seitdem sich das Modul direkt mit dem HMSocket verbindet, bekommt es auch die Daten Nachrichten.
Da es aber keine verarbeiten will, muss ein Filter gesetzt werden.

Was ist denn ein guter ‚ungültiger‘ Filter?

@NallChan, du wählst in deinem Beispiel

$this->SetReceiveDataFilter(".*9999999999.*");

Das ist ein super Filter. Nimm einfach etwas, das extrem unwahrscheinlich ist. (Falls es doch mal zutrifft, ist es egal… Es macht ja nichts kaputt)

Hier eine andere Lösung: dictionary - A Regex that will never be matched by anything - Stack Overflow

Hab ich hier genutzt: SymconLJ/module.php at master · symcon/SymconLJ · GitHub

paresy

Danke für eure Tipps!

Habe mich jetzt für

$this->SetReceiveDataFilter('(?!x)x');

entschieden. Der trifft nie zu :slight_smile:

Mit dem Beta update des HM_Inventory ist es nun viel besser geworden. Das Blind_controll und einige andere kommen aber immer noch, aber seltener.

Der Fall scheint mir hier anders gelagert zu sein.

Einen Teil kann ich mir erklären, da im Modul ein Timer aufgezogen wird:

        $this->RegisterTimer('Update', 0, 'BLC_ControlBlind(' . $this->InstanceID . ', true);');

Seltsamerweise steht aber hinter „Absender“ der Hinweis „RunScript“. Bei anderen Moduln steht da „TimerEvent“. Vielleicht mache ich da noch etwas falsch.

Die RequireOnce Einträge kann ich mir wiederum nicht erklären. Ein Filter scheint da aber wohl nicht zu fehlen, denn ein testweise eingebautes ReceiveData wird nie aufgerufen…