Script teil in mehreren Thraeds laufen lassen

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

  • Script teil in mehreren Thraeds laufen lassen

    moin,

    ich hab hier n script der relativ langsam is, aber schneller wäre wenn man ihn mehrmals gleichzeiting laufen lässt (also mit anderen parametern)

    PHP-Code:
    $host = array('www.google.de','www.msn.de'); // sin am ende dann viel mehr xD
    foreach ($host as $wert) {
        
    $res shell_exec('whosip.exe '.$wert); // macht ne whoisabfrage, dauert etwas lang, müsste aber zu beschleunigen sein da das inet ja nich komplett ausgelastet wird ....
    // $res müsste dann ja acuh noch vom namen her geändert werden, damits nich jedesmal überschrieben wird oda
        
    $res explode("\n",$res);


    wie mach ich das nu?
    jemand ne idee?

  • #2
    Du suchst proc_open()?

    Kommentar


    • #3
      oO
      soweit ich den befehl verstanden habe nicht ...

      is ja mit shell_exec() gelöst

      der script der hier steht funktioniert, ist nur etwas langsam, weil php ha die exe ausführ und wartet bis ne antwort kommt und dann erst im code weitergeht

      drumm möchste ich dass zB hier gleich die 2 element im array $host ausgeführt werden, also

      $res = shell_exec('whosip.exe '.'www.google.de');
      $res = shell_exec('whosip.exe '.'www.msn.de');

      gleichzeitig, nicht nacheinander

      damit $res dann nich überschrieben wird müsste man dann ahlt n bissle was ändern, zB

      $res[] = shell_exec('whosip.exe '.'www.google.de');
      $res[] = shell_exec('whosip.exe '.'www.msn.de');

      wie geht das?

      Kommentar


      • #4
        Das geht so nicht. Der PHP-Interpreter wartet auf die Rückgabe des ersten shell_exec() bevor er das nächste aufruft.

        Du suchst proc_open().

        Kommentar


        • #5
          ok xD

          d.h. mit dem befehl proc_open() fährt er gelich fort nachdem er den befehl ausgeführt hat, ohne auf ne antwort zu warten

          aber das is antürlich acuh nich so nice, falls im array n paar 100 seiten stehen.

          kann ich das irgentwie begrenzen, so zB auf 20-30?

          edit: sry falls das schon im manual steht,a ber das was da steht blick ich atm nich ^^
          Zuletzt geändert von leb0rtran; 04.12.2007, 20:34.

          Kommentar


          • #6
            Na klar kannst du das begrenzen. Es liegt doch an dir, wieviele Prozesse zu erzeugst.

            Kommentar


            • #7
              syr wenn cih mich grad total blöd anstell ^^ aber ich blick die funktion im manual ma überhauptnich

              resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )

              $cmd blick ich (bei mir: 'whosip.exe '.$wert)
              aber die anderen leider nich

              was is zB ne pipe?
              und kannste mir ma die parameter erklären plz? (wenigstens array $descriptorspec , array &$pipes, da die 2 ja auch zwingend notwendig sein müssn)

              Kommentar


              • #8
                Hast du dir das erste Beispiel im Manual mal angeschaut?
                PHP-Code:
                $descriptorspec = array(
                   
                => array("pipe""r"),  // stdin is a pipe that the child will read from
                   
                => array("pipe""w"),  // stdout is a pipe that the child will write to
                   
                => array("file""/tmp/error-output.txt""a"// stderr is a file to write to
                ); 
                Steht doch im Kommentar schön beschrieben.
                Das dritte Argument ist nur eine Referenz. Du brauchst gar keine Werte anzugeben. $var reicht. Diese steht dir danach zur Verfügung um die Ein- und Ausgabe zu steuern
                Weiteres dazu steht auch im Manual und im Beispiel zu dieser Fkt dort.

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  klar habs ich mir durchgelesen, mehrmals
                  aber blicken tu ichs trotzdem nich

                  was is zB stdin, stdout, was is immer mit pipe gemeint ...

                  is dann jeder wert von $descriptorspec der befehl der ausgeführt werden soll oder wie

                  sry ich blicks einfach nich


                  PHP-Code:
                  $host = array('www.google.de','www.msn.de');

                  foreach (
                  $host as $wert) {
                      
                  $descriptorspec[] = array($wert/*????*/);
                  }

                  process proc_open(whosip.exe$descriptorspec); 
                  oder wie soll das ausschauen??

                  Kommentar


                  • #10
                    Aber lesen und Google benutzen kannst du ?
                    http://de.wikipedia.org/wiki/Stdin
                    http://de.wikipedia.org/wiki/Pipe_%28Informatik%29
                    http://de.wikipedia.org/wiki/Senkrechter_Strich
                    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                    Kommentar


                    • #11
                      ok bringt mich nu auch nich viel weiter

                      jetzt weiß ich nur dasses falsch sein wird wie ichs geschrieben hab


                      kannst mir nich einfach sagen wies gehört?
                      weil langsam sinkt die motivation ...

                      Kommentar


                      • #12
                        Und die Anwendungsbeispiele im Manual hast du auch angeschaut. Zumindest dieses schaut so aus als könntest du das übernehmen.

                        Gruss

                        tobi
                        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                        Kommentar


                        • #13
                          aslo ich hab das ma so gemacht, kommt aber kein ergebniss ...

                          PHP-Code:
                          class Process
                          {
                              public static function 
                          open($command)
                              {
                                  
                          $retval '';
                                  
                          $error '';

                                  
                          $descriptorspec = array(
                                      
                          => array('pipe''r'),
                                      
                          => array('pipe''w'),
                                      
                          => array('pipe''r')
                                  );

                                  
                          $resource proc_open($command$descriptorspec$pipesnull$_ENV);
                                  if (
                          is_resource($resource))
                                  {
                                      
                          $stdin $pipes[0];
                                      
                          $stdout $pipes[1];
                                      
                          $stderr $pipes[2];

                                      while (! 
                          feof($stdout))
                                      {
                                          
                          $retval .= fgets($stdout);
                                      }

                                      while (! 
                          feof($stderr))
                                      {
                                          
                          $error .= fgets($stderr);
                                      }

                                      
                          fclose($stdin);
                                      
                          fclose($stdout);
                                      
                          fclose($stderr);

                                      
                          $exit_code proc_close($resource);
                                  }

                                  if (! empty(
                          $error))
                                      throw new 
                          Exception($error);
                                  else
                                      return 
                          $retval;
                              }
                          }
                          // ------------------------------------------------------------------

                          Process :: open('cat whosip.exe [url]www.google.de[/url]'); // da steht nur [url]www.[/url] google. de (ohne leerzeichen) ka was die forensoft da macht

                          echo "<pre>";
                          print_r($res);
                          echo 
                          "</pre>"

                          Process :: open('cat whosip.exe www.google.de');
                          das steht da ...
                          Zuletzt geändert von leb0rtran; 06.12.2007, 16:51.

                          Kommentar


                          • #14
                            Und woher kommt die Var $res, die du da dumpen willst?
                            In deiner aktuellen Fassung müsstest du es eher so schreiben
                            PHP-Code:
                            var_dump(Process::open('cat whoisp.exe www.google.ch'); 
                            Oder den Wert der Var $res zuweisen, was du aber nicht machst.

                            Gruss

                            tobi
                            Zuletzt geändert von jahlives; 07.12.2007, 09:13.
                            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                            Kommentar

                            Lädt...
                            X