+ Antworten
Ergebnis 1 bis 3 von 3
  1. #1
    Registriert seit
    Feb 2018
    Ort
    Bochum
    Beiträge
    672

    Standard 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

  2. #2
    Registriert seit
    Mar 2008
    Ort
    Ruesselsheim
    Beiträge
    3,568

    Bei Modulen gilt die Beschraenkung auch.
    Beispiel ist das SymDoc Modul. Dort kam fuer dieses Script eine
    PHP-Code:
    ini_set('max_execution_time'1800); 
    rein wegen langer Laufzeit.
    https://www.symcon.de/forum/threads/...540#post375540

  3. #3
    Registriert seit
    Feb 2018
    Ort
    Bochum
    Beiträge
    672

    Zitat Zitat von 1007 Beitrag anzeigen
    Bei Modulen gilt die Beschraenkung auch.
    Beispiel ist das SymDoc Modul. Dort kam fuer dieses Script eine
    PHP-Code:
    ini_set('max_execution_time'1800); 
    rein wegen langer Laufzeit.
    https://www.symcon.de/forum/threads/...540#post375540
    Hallo,

    danke für den Hinweis.

    Ich habe mir den entsprechen Abschnitt (/https://www.php.net/manual/de/info.configuration.php) und PHP: set_time_limit - Manual angeschaut.

    Da steht drin:

    Code:
    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

    PHP-Code:
    <?

    $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($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_TIMEOUT120);
    curl_setopt($chCURLOPT_FILE$fp);
    $cdata curl_exec($ch);
    $cerrno curl_errno($ch);
    $cerror $cerrno curl_error($ch) : '';
    $httpcode curl_getinfo($chCURLINFO_HTTP_CODE);
    curl_close($ch);

    $duration round(microtime(true) - $time_start2);
    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

Ähnliche Themen

  1. HTTP Request über Client Socket absetzen
    Von Fonzo im Forum Entwicklung mit PHP-SDK/Delphi-SDK
    Antworten: 5
    Letzter Beitrag: 22.03.16, 13:40
  2. HTTP request per POST funktioniert nicht
    Von yb1898 im Forum Skripte, PHP, SQL
    Antworten: 2
    Letzter Beitrag: 23.08.15, 22:33
  3. Neue Instar Firmware mit HTTP Request an Server
    Von JPaeper im Forum Audio & Video, TK-Anlagen, ISDN
    Antworten: 14
    Letzter Beitrag: 10.05.13, 09:21
  4. mit http request Variable abfragen?
    Von critical_limit im Forum Skripte, PHP, SQL
    Antworten: 9
    Letzter Beitrag: 26.02.12, 15:22