include_once funktioniert nicht mehr in Aktionen

Hallo zusammen,

ich habe einige Variablen die über ein angehängtes Ereignis aktualisiert werden. Im Ereignis gibt es ja eine Aktion in der man PHP-Code ausführen kann. So… und dort binde ich dann immer ein Script per inlcude_once ein. Das hat bisher super funktioniert.

Bei einem der letzten Updates ist das kaputt gegangen und diese Variante spuckt Fehler:

17.12.2019, 15:05:00 | ScriptEngine | Result for Event 24504
<br />
<b>Warning</b>:  include_once(Standard.ips.php): failed to open stream: No such file or directory in <b>C:\Windows\System32\-</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  include_once(): Failed opening 'Standard.ips.php' for inclusion (include_path='.;C:\php\pear') in <b>C:\Windows\System32\-</b> on line <b>1</b><br />
<br />
<b>Fatal error</b>:  Uncaught Error: Call to undefined function get_currency() in C:\Windows\System32\-:2
Stack trace:
#0 {main}
  thrown in <b>C:\Windows\System32\-</b> on line <b>2</b><br />

Das include_once funktioniert ansonsten in „normalen“ Scripten noch, nur eben nicht mehr in der Aktion PHP-Code ausführen.

IP-Symcon 5.3, Windows x64, 28.11.2019

Edit: Bug besteht auch in IP-Symcon 5.3, Windows x64, 16.12.2019, 0717398f8fbc
noch.

Funktionierte es wirklich früher mal? Du wirst den korrekten Pfad angeben müssen, also:

include_once(IPS_GetKernelDir() . 'scripts' . DIRECTORY_SEPARATOR . 'Standard.ips.php');

Was?
Das hab ich ja noch nie gemacht! Und so schon garnicht!

Hier ein Auszug aus einem Aktions-Skript in meinem System, das auch bei IPS-Version 5.3 funktioniert:


...
include_once "DefObjVis.inc.php";                      /* [CONFIG\StrukturDefinitionen\DefObjVis] */
include_once "DefSemap.inc.php";                       /* [CONFIG\StrukturDefinitionen\DefSemap] */
...


switch ($_IPS['SENDER']) {      // woher aufgerufen ??

// ---- X. Skriptauslöser Beim Klicken eines Buttons
    case "WebFront": /*  Wenn das Skript durch das WebFront ausgeführt wurde
          Systemvariable          Bedeutung
          $_IPS['INSTANCE']       ID der auslösenden WebServer Instanz
          $_IPS['CONFIGURATOR']   ID des aktuell genutzten Konfigurators
          $_IPS['VALUE']          Neuer Wert der Variable (integer)
          $_IPS['VARIABLE']       ID der zu ändernden Variable
         */
...


Ich lege allerdings alle Skripte mit dem IPS-Editor an.

brausepaul hat da anscheinend irgendwie die Pfade „verbogen“ nach include_path=’.;C:\php\pear’

Weiß nicht, welche Vorteile das bringt.
Ich kann nur empfehlen eine „Plain-IPS-Struktur“ zu verwenden und es IPS zu überlassen wo die Skripte angelegt werden.

Viele Grüsse
Harald

brausepaul hat da anscheinend irgendwie die Pfade „verbogen“ nach include_path=’.;C:\php\pear’

Hm, nein nicht wirklich. Ich habe da nichts verbogen, lediglich updates eingespielt. Das macht es ja schwierig, ich wüsste nicht mal wo ich an den Pfadangaben was drehen könnte.

Meine Scripte sehen so aus:

include_once "32135.ips.php";
SetValue($_IPS['TARGET'], get_etf("UIMI"));

und das include_once wirft seit den letzten updates Fehler. In normalen Scripten wie gesagt nicht, da klappt es weiterhin.

Den include Pfad setzt Symcon selber beim Ausführen eines Script.
Und normalerweise sollte dort der Script Ordner enthalten sein.
Den Fehler, das dieser Include bei bestimmten Aktionen (Aufrufern) fehlt, hatten wir auch schon Mal.
Michael

so nun habe ich in dem zweizeiligen Script mal das Problem der ersten Zeile durch einen absoluten Pfad umgangen und schon fällt er über zeile 2:

include_once "C:\ProgramData\Symcon\scripts\Standard.ips.php";
SetValue($_IPS['TARGET'], get_etf("DXSM"));
17.12.2019, 19:21:12 | ScriptEngine | Result for Event 30091
<br />
<b>Warning</b>:  Cannot auto-convert value for parameter VariableValue in <b>C:\Windows\System32\-</b> on line <b>2</b><br />

Edit: verweis auf anderen Fehler wieder entfernt, der war doch anders gelagert

Das ist etwas anderes.
Dort in der Fehlermeldung sieht man das mit absoluten Pfad gearbeitet wird.
Michael

Wo kann ich denn ggf. diesen falschen Pfad finden der seit dem Update gesetzt ist?

Er scheint ja die Scripte unter C:\Windows\System32\ zu suchen

17.12.2019, 19:35:00 | ScriptEngine | Result for Event 52403
<br />
<b>Warning</b>:  include_once(Standard.ips.php): failed to open stream: No such file or directory in <b>C:\Windows\System32\-</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  include_once(): Failed opening 'Standard.ips.php' for inclusion (include_path='.;C:\php\pear') in <b>C:\Windows\System32\-</b> on line <b>1</b><br />
<br />
<b>Fatal error</b>:  Uncaught Error: Call to undefined function get_currency() in C:\Windows\System32\-:2
Stack trace:
#0 {main}
  thrown in <b>C:\Windows\System32\-</b> on line <b>2</b><br />

Nicht verwirren lassen. Das ist eine Default Fehlermeldung.
Du kannst den Pfad selber nicht konfigurieren. Das macht der Dienst selber.
Du kannst aber sehr wohl den aktuellen include abfragen und auch für das aktuelle Script setzen.
Das geht mit set_include_path() und get_include_path().
Michael

echo get_include_path();
.;C:\php\pear

die Ausgabe in einem normalen Script und auch in einem „Erreignis PHP-Code ausführen“

Der Ordner . (Punkt) ist das aktuelle WorkingDirectory und sollte der Script Ordner sein.
Egal ob es sich um ein Script im Ordner oder Code im Ereignis handelt sollte bei der magischen Konstante DIR der Script Order enthalten sein.
Michael

Das folgende Skript in einem Ereignis unter 5.2 eingetragen:

echo json_encode ($_IPS) . PHP_EOL;
echo IPS_GetKernelVersion() . PHP_EOL;
echo __DIR__ . PHP_EOL;
echo get_include_path();

liefert im Meldungsfenster

17.12.2019, 20:01:10 | ScriptEngine | Result for Event 43585
{„SENDER“:„TimerEvent“,„SELF“:0,„EVENT“:43585,„TARGET“:41317,„THREAD“:4}
5.2
C:\Windows\System32
.;C:\php\pear

Ich sehe da noch keinen Unterschied zur 5.3

Dennoch funktioniert auch bei mir unter 5.2 ein include auf eine Datei im Script Verzeichnis ohne Angabe des Pfades. Es funktioniert aber nicht unter 5.3.

Ja ich habe mich verhauen.
Der include ist nicht besonders gesetzt, aber DIR sollte immer den Script Ordner enthalten.
Michael

So schauts bei mir aus:

17.12.2019, 20:07:30 | ScriptEngine | Result for Event 58899
{"SENDER":"TimerEvent","SELF":0,"EVENT":58899,"TARGET":30807,"THREAD":29}
5.3
C:\Windows\System32
.;C:\php\pear

Dann war das schon unter 5.2 falsch? Jetzt bin ich verwirrt.
@Paresy Hilfe :smiley:
Michael

Wenn ich mein Script das ich includieren will unter C:\Windows\System32 kopiere läuft alles wieder.
Das kann nur nicht wirklich die Lösung bleiben.

Nein, unter 5.2 funktioniert der include in einem Event-Code. Warum auch immer:)

Spannend ist, das es unter der 5.2 funktioniert haben soll. (War deine 5.2 up to date?) Denn wir haben seit langem nichts an PHP geändert. Nichtmal die PHP Version hat sich von der 5.2 auf die 5.3 geändert.

paresy

include_once('20724.ips.php');
echo '---' . PHP_EOL;
echo json_encode ($_IPS) . PHP_EOL;
echo IPS_GetKernelVersion() . PHP_EOL;
echo IPS_GetKernelRevision() . PHP_EOL;
echo phpversion() . PHP_EOL;
echo __DIR__ . PHP_EOL;
echo get_include_path();

liefert

18.12.2019, 11:46:40 | ScriptEngine | Result for Event 43585
ich bin inkludiert.
---
{"SENDER":"TimerEvent","SELF":0,"EVENT":43585,"TARGET":41317,"THREAD":7}
5.2
beadf93761da5b5b269f5a4eecde882bdacbaa8c
7.3.8
C:\Windows\System32
.;C:\php\pear

Leider kann ich wenig dazu sagen auf welchem Stand IPS war als ich es am 30.11. upgedatet hatte. Das Datum weiß ich auch nur weil meine Variablen seit dem nicht mehr aktualisiert wurden. Erst jetzt hatte ich die Werte benötigt und bemerkt das mein Event-Code nicht mehr lauffähig ist.