langlaufenden HTTP-Request korrekt handhaben

Hallo,

mir fehlt mal wieder etwas Grundwissen zu IPS.

Folgende Anforderung:

ich möchte mir in einem Modul mit einem http-GET eine MP4-Datei holen, technisch natürlich kein Problem.Mein Problem ist die Laufzeit; der Abruf dauert bei mir ca. 60s (Internetanbindung 200 Mbit/s). Die Datei wird bei dem Aufruf erst generiert (was sicherlich die Dauer ausmacht) und ist ca. 40 MB groß. Dh bei eine schmalbrüstigen Anbindung kommen durchaus nochmal 20-30s dazu.

Das kollidiert natürlich mit den Laufzeiten eines PHP-Thread. Ich habe nochmal in der Doku (zu IPS_Sleep) nachgelesen, das Script nicht länger als 30s dauern dürfen/sollten.

  1. Gibt es die Limitierung aus bei Modulen? Meine Erfahrung sagt nein, die Laufzeit von Threads von Modulen sind unlimiiert.

  2. mit ist nicht klar, ob von einem Modul gleichzeitig nur ein Thread laufen kann, sprich wenn zB die o.g. Datenbeschaffung läuft, reagiert das Modul dann z.B. noch auf Nachrichten bzw Timer?
    Meine Beobachtung ist ja, aber da bin ich mir nicht sicher.

  3. wie verhält sich das, wenn ich die Funktion zur Beschaffung dieser Daten als public zur Verfügung stelle und dann aus einem Script aufrufe: ich würde erwarten, das das Script dann nach 30s abgebrochen wird und damit auch die Modul-Funktion.

Mit ist klar, das langlaufende Prozesse immer ein Problem darstellen, weil sie ja minimal einen Thread belegen. Mit ist aber keine Möglichkeit bekannt, das anders mit Bordmitteln (im Rahmen eines Moduls) zu lösen.
Klar kann man das (unter Linux) per cron-Aufruf und url machen, aber das ist aus meiner Sicht eher nichts für die Verwendung in einem Modul.

Für ein paar erhellende Informationen/Gedanken wäre ich dankbar
demel

Bei Modulen gilt die Beschraenkung auch.
Beispiel ist das SymDoc Modul. Dort kam fuer dieses Script eine

ini_set('max_execution_time', 1800);

rein wegen langer Laufzeit.
https://www.symcon.de/forum/threads/39004-Vorstellung-SymDoc-Modul-%28Beta%21%29-automatisierte-Doku-der-IP-Symcon-Umgebung?p=375540#post375540

Hallo,

danke für den Hinweis.

Ich habe mir den entsprechen Abschnitt (/PHP: Laufzeit-Konfiguration - Manual) und PHP: set_time_limit - Manual angeschaut.

Da steht drin:


Hinweis:
Die set_time_limit()-Funktion und die max_execution_time Konfigurationsdirektive beschränken nur die Ausführungszeit des Skripts selbst. Zeit die für Aktivitäten außerhalb des Skripts aufgebracht wird wie z.B. die Ausführung von Systemaufrufen mit system(), Streamoperationen, Datenbankabfragen usw. werden nicht in die Berechnung der Ausführungszeit mit einbezogen.

Bei meiner Frage geht es ja ausschliesslich um Zeit, die ich auf den HTP-Strem warte, ist danach nicht relevant.

ein kleiner Versuch


<?

$url = 'http://x.x.x.x/xxxx/command/dl/timelapse';

$fp = fopen('/tmp/abc.mp4', 'w');

$time_start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_FILE, $fp);
$cdata = curl_exec($ch);
$cerrno = curl_errno($ch);
$cerror = $cerrno ? curl_error($ch) : '';
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$duration = round(microtime(true) - $time_start, 2);
echo ' => errno=' . $cerrno . ', httpcode=' . $httpcode . ', duration=' . $duration . 's' . PHP_EOL;
echo '    cdata=' . strlen($cdata) . PHP_EOL;

fclose($fp);

zeigt, das es funktioniert: die Dauer waren 51s und /tmp/abc.mp4 war 39 MB groß.

D.h. für mich, es geht technisch.
Wichtige Erkenntnis für mich: die von IPS angegebenen 30s sind die aus der php.ini und sind also nur die CPU-User-Time (also ohne SYS und WAIT).

Trotzdem ist solang natürlich ein Thread-Slot belegt.

demel