Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL Query mit pcntl_fork()

Einklappen

Neue Werbung 2019

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

  • MySQL Query mit pcntl_fork()

    Hi ^^
    ich starte mit der funktion pcntl_fork() mehrere Prozesse, dessen output möchte ich gerne in einer Datenbank speichern.
    "mysql_query" scheint da wohl nicht zu funktionieren. Hat jemand eine Idee ?

  • #2
    @hoctar: Du wirst auffällig. Du musst dringend an der Qualität deiner Postings arbeiten, vor allem beim eröffnen neuer Threads.

    Kommentar


    • #3
      Zitat von cycap Beitrag anzeigen
      @hoctar: Du wirst auffällig. Du musst dringend an der Qualität deiner Postings arbeiten, vor allem beim eröffnen neuer Threads.
      besonders wers wagt mit php zu forken, sollte das auf die reihe kriegen...
      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
      [/B]

      Kommentar


      • #4
        Wobei die Betonung auf PHP liegt. Photocase - Bauer sucht Frau
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Zitat von brian johnson Beitrag anzeigen
          besonders wers wagt mit php zu forken, sollte das auf die reihe kriegen...
          Das hilft mir echt weiter -.-

          Mein Script sieht in etwa so aus:
          PHP-Code:
          $pids = array();
          $j 0;
          $csv fopen('datei.csv''r');
          while(
          $data fgetcsv($csv32';'))
           {
            
          $j++;
            
          $pids[$j] = pcntl_fork();
            
            if(!
          $pids[$j]) 
             {
               
          $eintrag "INSERT INTO test (id, zeit) VALUES ('$data[0]', 'now()')";
               
          mysql_query($eintrag);
             }

          for(
          $i 0$i $j$i++) {
            
          pcntl_waitpid($pids[$i], $statusWUNTRACED);

          aber leider funktioniert das so nicht, weil der child die verbindung schließt.

          Ich habe mir schon überlegt für jeden Prozess eine neue DB verbindung aufzubauen. Würde das so gehen ? Habt ihr noch andere Möglichkeiten ?

          Kommentar


          • #6
            Kannst du begründen warum du forkst ?
            Aktuell denke ich dass du nen Haufen Overhead was RAM-Verbrauch + CPU-Last angeht hast, nur durch das forken eines kleinen insert-querys.

            Wenn deine daten schon als csv vorliegen und die datenmenge wirklich groß ist, wäre es vielleicht sinnvoller die Daten direkt mit mysqls LOAD DATA INFILE einzulesen das dürfte performanter sein (notfalls vorformatieren der csv damit es passt).

            dein 'now()' in deinem query wird übrigends nicht ausgeführt sondern so in die DB eingetragen ... ich weis ja nicht ob das der sinn der sache ist. Wenn du das NOW() trotzdem brauchst, kannst du ja die ids auslesen aus der CSV und dann ein

            UPDATE test SET zeit = NOW() WHERE id IN (hier die gesammelten ids);

            drüberjagen nachdem alles drin ist.
            [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
            | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

            Kommentar


            • #7
              Kannst du begründen warum du forkst ?
              Aktuell denke ich dass du nen Haufen Overhead was RAM-Verbrauch + CPU-Last angeht hast, nur durch das forken eines kleinen insert-querys.

              Wenn deine daten schon als csv vorliegen und die datenmenge wirklich groß ist, wäre es vielleicht sinnvoller die Daten direkt mit mysqls LOAD DATA INFILE einzulesen das dürfte performanter sein (notfalls vorformatieren der csv damit es passt).

              dein 'now()' in deinem query wird übrigends nicht ausgeführt sondern so in die DB eingetragen ... ich weis ja nicht ob das der sinn der sache ist. Wenn du das NOW() trotzdem brauchst, kannst du ja die ids auslesen aus der CSV und dann ein

              UPDATE test SET zeit = NOW() WHERE id IN (hier die gesammelten ids);

              drüberjagen nachdem alles drin ist.
              [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
              | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

              Kommentar


              • #8
                In der datei.csv stehen nur ids, die ich benutze um in einer anderen Datei Textabschnitte auszulesen. Ich speichere diese Abschnitte in der DB. Damit das nicht alles nacheinander, sondern parallel ablaufen kann benutze ich if forks.

                Kommentar


                • #9
                  mysql kann das doch eh nicht parrallel verarbeiten, im endeffekt wandern die inserts auch nacheinander in die Tabelle bevor du sie verwenden kannst.

                  schau dir mal den link zu load data infile an, wenn du zugang zu ner shell und damit zu mysql-console hast anstatt über php zu gehen, ist das wohl die schnellste lösung, ansonsten das query über php verwenden.
                  [URL="http://www.robo47.net"]robo47.net[/URL] - Blog, Codeschnipsel und mehr
                  | :arrow: [URL="http://www.robo47.net/blog/192-Caching-Libraries-and-Opcode-Caches-in-php-An-Overview"]Caching-Klassen und Opcode Caches in php[/URL] | :arrow: [URL="http://www.robo47.net/components"]Robo47 Components - PHP Library extending Zend Framework[/URL]

                  Kommentar


                  • #10
                    ok danke für die tips

                    Wie könnte man die Prozesse die gleichzeitig laufen auf z.B. 10 begrenzen ? Gibts da zu irgend eine pcntl funktion ?

                    Kommentar


                    • #11
                      Zitat von hoctar Beitrag anzeigen
                      Das hilft mir echt weiter -.-

                      Mein Script sieht in etwa so aus:
                      PHP-Code:
                      $pids = array();
                      $j 0;
                      $csv fopen('datei.csv''r');
                      while(
                      $data fgetcsv($csv32';'))
                       {
                        
                      $j++;
                        
                      $pids[$j] = pcntl_fork();
                        
                        if(!
                      $pids[$j]) 
                         {
                           
                      $eintrag "INSERT INTO test (id, zeit) VALUES ('$data[0]', 'now()')";
                           
                      mysql_query($eintrag);
                         }

                      for(
                      $i 0$i $j$i++) {
                        
                      pcntl_waitpid($pids[$i], $statusWUNTRACED);

                      aber leider funktioniert das so nicht, weil der child die verbindung schließt.

                      Ich habe mir schon überlegt für jeden Prozess eine neue DB verbindung aufzubauen. Würde das so gehen ? Habt ihr noch andere Möglichkeiten ?
                      schleife + fork? pass auf das dein pc nicht gleich das hier singt...

                      Wie könnte man die Prozesse die gleichzeitig laufen auf z.B. 10 begrenzen ? Gibts da zu irgend eine pcntl funktion ?
                      das macht in deinem fall wenig sinn. threads und forks sind dazu da, um dinge die wirklich gleichzeitig passieren sollen auch (begrenzt) gleichzeitig auszuführen. so z.b. ein server der mit mehreren clients gleichzeitig redet. in deinem fall jedoch wo du nur mit einer datei arbeiten musst, bleib bei einem prozess das ist hardwareschonender und definitiv nicht langsamer als mehrere prozesse (die sich auch noch abstimmen müssten, wer was liest und zudem auf mysql warten müssen und dieses wiederrum auf fsync [was du mit lock table oder transaktionen umgehen kannst])
                      [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                      [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                      [/B]

                      Kommentar


                      • #12
                        in deinem fall jedoch wo du nur mit einer datei arbeiten musst
                        Ich arbeite mit mehreren Dateien.

                        Ich habe das nun so versucht:
                        PHP-Code:
                        while($data fgetcsv($csv64';'))
                         {

                          while(
                        $prozess[$j] != 0)
                           {
                            
                        $currentprozess $j;
                            
                        $j++;
                            if(
                        $j == 9)
                             {
                              
                        $j 0;
                             }
                           }
                           
                           
                        $pid pcntl_fork();
                           
                        $prozess[$j] = $pid;

                          if(!
                        $pid// Child process start
                           
                        {
                            
                        //Anweisungen
                           
                        $prozess[$currentprozess] = 0;
                           }

                        Also in dem Array "Prozess" sind die PIDs gespeichert, wenn der Prozess zuende gelaufen ist setzt er seine PID im Array auf Null und die while überprüft immer ob gerade 10 Prozesse am laufen sind.
                        So habe ich es mir eigentlich gedacht, aber das geht leider nicht. Das Script führt die ersten 10 Prozesse aus und bleibt dann in der schleife hängen. Wahrscheinlich kann man im Prozess keine Variablen nach ausen hin verändern.
                        Hat da einer eine Idee wie ich die Varibale $prozess[$currentprozess] auf null setzte nach dem der prozess abgeschlossen ist ?

                        Kommentar


                        • #13
                          Zitat von hoctar Beitrag anzeigen
                          Ich arbeite mit mehreren Dateien.
                          der gepostete code sagt was anderes.
                          [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                          [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                          [/B]

                          Kommentar


                          • #14
                            Ich benutze im Kind Prozess mehrere Funktionen die aus einer Datei lesen.
                            Das hat aber nix mit meinem Problem zutun.

                            Kommentar


                            • #15
                              Zitat von hoctar Beitrag anzeigen
                              Das hat aber nix mit meinem Problem zutun.
                              nein, dein problem ist verständnis. erkläre bitte jede zeile deines hier geposteten codes, vielleicht kommen wir dann weiter.
                              [B]PHP4?!?[/B]>>>[B]Aktuelle[/B] PHP Version: [B]5.2.11 || 5.3.0
                              [URL="http://en.opensuse.org/Factory/News"]Suse 11.2 *vorfreude*[/URL]
                              [/B]

                              Kommentar

                              Lädt...
                              X