Script im Hintergrund starten

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

  • Script im Hintergrund starten

    Hallo Community

    Ich habe ein Problem

    Die Forum-Suche zu diesem Thema habe ich durch, deswegen habe ich mich entschlossen, zu posten.

    Mit exec() und system() funktioniert es nicht wie gewünscht.

    Das Problem ist, dass ich ein PHP-Script habe welchen etwas spezielles anstösst. Das dauert jedoch über 30 Sekunden, weswegen das Script abbricht. Zudem ist es dem Benutzer der Site auch nicht zuzumuten, über 30 Sekunden für eine weitere Seite zu warten.

    Nun soll das Script im Hintergrund ausgeführt werden und das vom Benutzer aufgerufene Script (PHP) soll einfach die entsprechende Ausgabe machen, OHNE auf das per EXEC gestartete Return-Ergebnis zu warten. Leider funktioniert das nicht

    PHP-Code:
    <?php
    exec
    ("php -f test.php");
    echo 
    "<br>Test OK";
    ?>
    test.php führt dabei den Vorgang aus welcher über 30 Sekunden dauert. Jemand eine Idee, was da falsch sein könnte?

    Grüsse
    binaer

  • #2
    dürfte man fragen, was das script macht, dass es so lange dauert?
    Signatur-Text ...

    Kommentar


    • #3
      Sicherlich die falsche Funktion, da exec() bis zum Ende des Aufrufes wartet, da exec() die letzte Zeile der Ausgabe liefert.

      Wie du es jetzt besser lösen könntest, fällt mir spontan nicht ein!

      Kommentar


      • #4
        Original geschrieben von dani_o
        dürfte man fragen, was das script macht, dass es so lange dauert?
        Es richtet einige DNS-Zonen auf einigen DNS-Servern per rsync ein. Das dauert leider ein wenig.

        @Trashar:
        danke aber ich weiss auch nicht weiter

        Grüsse
        binaer

        Kommentar


        • #5
          Cron evtl?!

          sprich den befehl in der db speichern, per cron die db auslesen, ausführen raus löschen..
          so ein wenig wie confixx es handhabt..
          mfg

          Kommentar


          • #6
            Original geschrieben von Trashar
            Cron evtl?!

            sprich den befehl in der db speichern, per cron die db auslesen, ausführen raus löschen..
            so ein wenig wie confixx es handhabt..
            mfg
            Daran habe ich auch schon gedacht, möchte das ganze aber schon wenn möglich "realtime" haben. Einen Cron-Job auszuführen... ich weiss nicht.

            Gibt es tatsächlich keine Funktion welche es mir ermöglicht, einen Host-Prozess von einem Child zu lösen und unabhängig laufen zu lassen?

            Kommentar


            • #7
              Ma ne blöde Frage!
              Wieso benutzt Du dann nicht AJAX?
              Einfach Server-Request nachfragen ... So bekommst Du das Ergebnis im Hintergrund geliefert ...
              Signatur-Text ...

              Kommentar


              • #8
                Original geschrieben von dani_o
                Ma ne blöde Frage!
                Wieso benutzt Du dann nicht AJAX?
                Einfach Server-Request nachfragen ... So bekommst Du das Ergebnis im Hintergrund geliefert ...
                hab mich damit noch nie befasst

                Kommentar


                • #9
                  Original geschrieben von binaer
                  hab mich damit noch nie befasst
                  ist ganz einfach

                  PHP-Code:
                      <script type="text/javascript" >
                      var 
                  g_remoteServer "Deine.php";
                      var 
                  g_intervalID;
                      function 
                  callServer() 
                      {    
                          var 
                  head document.getElementsByTagName('head').item(0);
                          var 
                  old  document.getElementById('lastLoadedCmds');
                          if (
                  oldhead.removeChild(old);
                          
                  script document.createElement('script');
                          
                  script.src g_remoteServer;
                          
                  script.type 'text/javascript';
                          
                  script.defer true;
                          
                  script.id 'lastLoadedCmds';
                          
                  void(head.appendChild(script));
                      }
                      
                  g_intervalID setInterval(callServer,5000);
                      
                  callServer();
                      </
                  script
                  ... führt den Request aus. In diesem Fall aller 5 Sekunden. Ersetze "Deine.php" mit deiner Datei. Nun musst Du ja noch die Ausgabe übergeben. Dazu musst Du erst mal ein Objekt festlegen nehme in der SELBEN DATEI folgendes in den Header:

                  PHP-Code:
                   <SCRIPT LANGUAGE="JavaScript">
                  <!--
                  function 
                  getObj(name)
                  {
                    if (
                  document.getElementById)
                    {
                        
                  this.obj document.getElementById(name);
                      
                  this.style document.getElementById(name).style;
                    }
                    else if (
                  document.all)
                    {
                      
                  this.obj document.all[name];
                      
                  this.style document.all[name].style;
                    }
                    else if (
                  document.layers)
                    {
                      
                  this.obj getObjNN4(document,name);
                      
                  this.style this.obj;
                    }
                  }

                  function 
                  getObjNN4(obj,name)
                  {
                      var 
                  obj.layers;
                      var 
                  foundLayer;
                      for (var 
                  i=0;i<x.length;i++)
                      {
                          if (
                  x[i].id == name)
                               
                  foundLayer x[i];
                          else if (
                  x[i].layers.length)
                              var 
                  tmp getObjNN4(x[i],name);
                          if (
                  tmpfoundLayer tmp;
                      }
                      return 
                  foundLayer;
                  }


                  //-->
                  </SCRIPT
                  und füge einen <div>-Layer mit einem Namen ein - Bsp: "Ausgabe". In der test.php übergibst Du dann die Ausgabe folgendermaßen:

                  PHP-Code:
                  var userbox=new getObj('Ausgabe');
                  userbox.obj.innerHTML="<?=$php_ergebnis?>";
                  Signatur-Text ...

                  Kommentar


                  • #10
                    Als Bsp kannst du mal auf http://www.flirtchance.net gehen - wenn Du Dir den chat anschaust, da habe ich dieses Script benutzt und es funzt top!
                    Signatur-Text ...

                    Kommentar


                    • #11
                      Ürgs, pures jscript. Wer macht sich denn an sowas noch
                      die finger schmutzig. Es gibt doch sicher php-wrapper die dir
                      den entsprechenden code erzeugen oder ? Würde mich
                      wundern wenn nicht.

                      greets
                      (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                      Kommentar


                      • #12
                        Original geschrieben von closure
                        Ürgs, pures jscript. Wer macht sich denn an sowas noch
                        die finger schmutzig. Es gibt doch sicher php-wrapper die dir
                        den entsprechenden code erzeugen oder ? Würde mich
                        wundern wenn nicht.

                        greets
                        o.O

                        Manchmal kann es auch js sein
                        Signatur-Text ...

                        Kommentar


                        • #13
                          @dani_o

                          Besten Dank für's Beispiel.

                          Hab's nun wie folgt:
                          test.php
                          PHP-Code:
                          $request = bla(bla);

                          ?>
                          var userbox=new getObj('Ausgabe');
                          userbox.obj.innerHTML="<?=$request?>";
                          und die test2.php (welcher der Kunde aufruft):
                          PHP-Code:
                          <script type="text/javascript" >
                              var 
                          g_remoteServer "test.php.php";
                              var 
                          g_intervalID;
                              function 
                          callServer() 
                              {    
                                  var 
                          head document.getElementsByTagName('head').item(0);
                                  var 
                          old  document.getElementById('lastLoadedCmds');
                                  if (
                          oldhead.removeChild(old);
                                  
                          script document.createElement('script');
                                  
                          script.src g_remoteServer;
                                  
                          script.type 'text/javascript';
                                  
                          script.defer true;
                                  
                          script.id 'lastLoadedCmds';
                                  
                          void(head.appendChild(script));
                              }
                              
                          g_intervalID setInterval(callServer,5000);
                              
                          callServer();
                              </
                          script>
                               
                               <
                          SCRIPT LANGUAGE="JavaScript">
                          <!--
                          function 
                          getObj(name)
                          {
                            if (
                          document.getElementById)
                            {
                                
                          this.obj document.getElementById(name);
                              
                          this.style document.getElementById(name).style;
                            }
                            else if (
                          document.all)
                            {
                              
                          this.obj document.all[name];
                              
                          this.style document.all[name].style;
                            }
                            else if (
                          document.layers)
                            {
                              
                          this.obj getObjNN4(document,name);
                              
                          this.style this.obj;
                            }
                          }

                          function 
                          getObjNN4(obj,name)
                          {
                              var 
                          obj.layers;
                              var 
                          foundLayer;
                              for (var 
                          i=0;i<x.length;i++)
                              {
                                  if (
                          x[i].id == name)
                                       
                          foundLayer x[i];
                                  else if (
                          x[i].layers.length)
                                      var 
                          tmp getObjNN4(x[i],name);
                                  if (
                          tmpfoundLayer tmp;
                              }
                              return 
                          foundLayer;
                          }


                          //-->
                          </SCRIPT>

                          <
                          div id="Ausgabe">
                          Dies ist ein Test
                          </div
                          Leider funktioniert das nicht
                          vermutlich liegts daran, dass ich den Content in die falschen Files gepastet habe?!

                          Kommentar


                          • #14
                            In einem kleinem Frame im hintergrund laden?!
                            in einem Bild?!
                            Aber bei allen ist das Problem, wie reagiert wird, wenn die Seite vom benutzer geschlossen wird.

                            Kommentar


                            • #15
                              @ binaer

                              Stimmt soweit
                              Probier folgendes:

                              ersetze mal alle Zeilenumbrüche - dann müsste es funzen. Bsp:

                              PHP-Code:
                              $request str_replace("\n"," ",bla(bla)); 
                              Signatur-Text ...

                              Kommentar

                              Lädt...
                              X