Wann wird die autoload.php geladen

Ich verwende die autoload.php um Funktionen aus Skripten global verfügbar zu haben. Ohne include oder ähnliches.

<?php
//Globale Funktionen
require_once(IPS_GetKernelDir() . "/scripts/56790.ips.php");
//Nmap Netzwerkscanner
require_once(IPS_GetKernelDir() . "/scripts/57045.ips.php");
//Amazon Echo
require_once(IPS_GetKernelDir() . "/scripts/26244.ips.php");
//Evohome
require_once(IPS_GetKernelDir() . "/scripts/23877.ips.php");
//Logfile
require_once(IPS_GetKernelDir() . "/scripts/26549.ips.php");
//EnergierechnerV2
require_once(IPS_GetKernelDir() . "/scripts/28526.ips.php");
//HA Globale Funktionen
require_once(IPS_GetKernelDir() . "/scripts/47831.ips.php");
//Nanoleaf Globale Funktionen
require_once(IPS_GetKernelDir() . "/scripts/24442.ips.php");

Sieht so aus. Aufrund diverser Umstellungen ist sie angewachsen und ich frage mich, wann die autoload geladen wird und ob die Strategie in Bezug auf RAM Verbrauch und Performance gut ist. Ich vermute, dass sie bei jedem neuen PHP Thread geladen wird, denke ich. Da ich es aber nicht weiß, frage ich hier.

Und auch, ob es eine bessere Lösung gibt.

Die __autoload.php wird von Symcon bei jeder Skriptausführung berücksichtigt, d. h. dein ganzer Block require_once(...) hängt an jedem PHP‑Thread dran. Das ist funktional okay, aber aus RAM‑ und Performance‑Sicht solltest du die Datei schlank halten: nur wirklich globale, universell genutzte Helper/Funktionen dort reinpacken und Spezialskripte (Nmap, Echo, Evohome, Nanoleaf, …) besser nur in den Skripten einbinden, die sie tatsächlich brauchen.

Soweit die Theorie :slight_smile:

Was die includes wirklich kosten, kannst du leicht testen. Nimm einen Skript mit z.B.

echo 'Halle Welt';

und lass es im Skript-Editor ausführen.

In der Fußzeile ziehst du dann für einen kurzen Moment, was die Includes dich kosten.

Wenn du Werte unter 10 ms siehst, würde ich sagen, es ist alles ok.

Ich selber nutze die Technik nicht und bei mir dauert das Skript 1 ms.

Bedenke auch, das sehr viel von PHP gecached. Von daher vermute ich, dass die Performance bei dir nicht das Thema sein wird.

“Hallo Welt” hat 40ms gebraucht. Dann hab ich es wie von dir empfohlen mit “Halle Welt” probiert. Und siehe da, es waren nur mehr 22ms. Noch mal ausgeführt und es war auf 1ms runter.

Mir ist schon klar, dass es keinen Unterschied macht ob Halle oder Hallo ;-). Ich denke der Cache hat dann mitgespielt. Dann ist es so, wie ich schon vermutet habe. Jeder Thread verarbeitet die.

Danke.

Gibt es eine andere Möglichkeit außer dem include? Ähnlich bei den Modulen, wo die Funktionen auch global zur Verfügung stehebn und sogar im Editor in der Vorschau angezeigt werden?

Ich habe “nur” ein Script mit “allem”, das ich bei Bedarf in den Scripten include

include_once("56429.ips.php"); // GlobalDefinesAndFunctions

Ich hab das nochmal in 2 Files aufgeteilt (Definitionen & Funktionen) :smiley:

require_once IPS_GetKernelDir() . '/scripts/System.Locals.ips.php';
require_once IPS_GetKernelDir() . '/scripts/System.Functions.ips.php';

Wäre cool, wenn man das ganze einmal zentral machen könnte um das ein für alle mal gelöst zu haben ohne in jedem Skript ein include oder require machen zu müssen.

Jedes laden kostet Zeit, jede Funktion braucht Millisekunden, …

Deshalb binde ich es nur da ein, wo ich es brauche.

Ja, kann ich verstehen. Ich bin trotzdem wieder zurück von include auf die autoload.php. Das ist mir zu unbequem :wink:

Die Millisekunmden hab ich Zeit. Ist ja nicht so, dass es nicht funktioniert hat oder es merklich langsam war.

2 „Gefällt mir“

Für “einfach und komfort” ist autoload am Besten, allerdings auch der Punkt, der alles komplett lahmlegt, wenn ein Fehler in einem der autoload-Scripte ist.

1 „Gefällt mir“

Ja, das heißt es aufpassen :smiley: