Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] exec und PHP Ausgabestreams

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] exec und PHP Ausgabestreams

    Servus,

    ich brauche Eure Unterstützung.

    Ich führe mit PHP eine selbst-geschriebene Anwendung aus, die auf dem Server liegt. Das klappt auch wunderbar. Die Anwendung selbst braucht ca 30 Sekunden bis sie mit in der Variable $return_int eine Rückmeldung gibt. (1=Erfolgreich, oder diverse Fehlercodes)

    Nun, das Problem welches ich nun habe ist, dass die komplette PHP-Website nicht mehr reagiert, weil sie auf die Ausgabe des Programms wartet. Ich starte also mittels der PHP-Funktion "exec" die Funktion und kann mir dann erst mal einen Kaffee holen...


    PHP-Code:
    $return_int 0;
    $return_array = array();

    exec("C:\\xampp\\htdocs\\[......]\\test.exe \"var1\" \"var2\" \"var3\"",$return_array,$return_int);  

    echo 
    $return_int
    Das ganze per Ajax an den Server zu schicken bringt gar nichts. Die Webseite reagiert erst wieder, wenn der Request durch ist.



    In der PHP-Doku steht folgendes:

    Beachten Sie auch, dass wenn Sie ein Programm mit dieser Funktion starten und Sie es im Hintergrund laufen lassen möchten, Sie sicherstellen müssen, dass die Ausgabe des Programms in eine Datei oder anderenen Ausgabestream umgeleitet wird. Andernfalls wird PHP solange laufen, bis das Programm beendet ist.
    Meine Frage ist nun, wie das mit den unterschiedlichen Ausgabestreams funktioniert?
    Wie bekomme ich PHP dazu, das ganze im Hintergrund laufen zu lassen, damit die Webseite weiterhin verfügbar bleibt?
    Hat jemand ein Codebeispiel?


  • #2
    Hier und Hier dürfte entsprechend nützliches Zeugs stehen.

    Kommentar


    • #3
      Danke!

      Dass PHP Threading (ab 5.3) kann wusste ich ja gar nicht!
      Das wäre die perfekte Lösung, aber ich bin nicht Admin des Servers und mein Vorschlag mal auf 5.3 upzudaten wurde schon mehrfach abgelehnt.

      Daher folgende einfache Lösung:
      PHP-Code:
      function execInBackground($cmd) {
          if (
      substr(php_uname(), 07) == "Windows"){
              
      pclose(popen("start /B "$cmd"r")); 
          }
          else {
              
      exec($cmd " > /dev/null &");  
          }


      $return_int 0;
      $return_array = array();

      $cmd "C:\\xampp\\htdocs\\[......]\\test.exe \"var1\" \"var2\" \"var3\"";

      execInBackground($cmd); 
      Nachteil:
      Ich bekomme keine Rückgabewerte mehr (logisch). Ich werde hier aber einfach mit einer kleinen Textdatei arbeiten und nach Funktionsaufruf mit JS sekündlich prüfen ob sie da ist, und wenn ja was diese sagt.

      Danke und Grüße!

      Kommentar


      • #4
        finde ja forking besser:
        PHP-Code:
        if (function_exists('pcntl_fork') && function_exists('posix_kill') ){
          switch (
        $pid pcntl_fork()) {
           case -
        1:
              
        // @fail
              // managing this via exec 
            
        die('Fork failed');
           break;
          case 
        0:
             
        // @child: running sync :
            /* do something */
            
        posix_kill(getmypid(),9); // cleaning up child
           
        break;
         default:
             
        // @parent
             // got nothing to do then exit
          
        break;

        . Ich werde hier aber einfach mit einer kleinen Textdatei arbeiten und nach Funktionsaufruf mit JS sekündlich prüfen ob sie da ist, und wenn ja was diese sagt.
        http://chimera.labs.oreilly.com/book...0545/ch16.html

        Kommentar


        • #5
          5.3 kann nicht aus dem Stand heraus Multithreading. Wenn dein Admin ein Upgrade auf 5.3+ nicht hinbekommt, dann braucht ihr wohl einen neuen Admin.
          Wenn ihr Applikationen habt, die aus Gründen nicht mit php5.3+ funktionieren, dann habt ihr gleich mehrere Optionen:
          - Gründe, warum eine Applikation nicht unter aktuellen PHP-installationen laufen gibt es viele. In der Regel sind sie aber ungesund und sollten sowieso behoben werden.
          - Ihr könnt eine zweite PHP Version parallel auf dem gleichen Server betreiben. Es gibt verschiedene Möglichkeiten sowas umzusetzen. Eine wäre Varnish auf Port 80, Apache mit PHP>5.2 auf 127.0.0.1:8080, Apache mit PHP5.2 auf 127.0.0.1:8081.
          - Ihr könnt schauen, ob es von der problembereitenden Applikation ein Update gibt, welches für den Einsatz eines aktuellen PHP ausgelegt ist.

          PHP5.3 hat nicht nur viele neue Funktionen, sondern ist auch wesentlich schneller und bekommt anders als 5.2 noch bugfixes.
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Verstehe nicht warum die (komplette) PHP-Webseite nicht mehr reagieren sollte, nur weil ein exec ausgeführt wird. Der eine, vom Request angestoßene Prozess wartet auf die Rückgabe von exec, mehr wird aber nicht geblockt. Von einem anderen Rechner oder auch nur mit einem anderen Browser sollte weiterhin funktionieren.
            DevBlog|3D Online-Shopping|Xatrium

            Kommentar

            Lädt...
            X