Ankündigung

Einklappen
Keine Ankündigung bisher.

fork / daemon

Einklappen

Neue Werbung 2019

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

  • fork / daemon

    Hallo alle zusammen,

    es gibt öfters das Szenario, dass ich beim Laden einer Seite Aktionen (Cache etc.) ausführen möchte die etwas länger dauern.
    Diese lasse ich dann im Kindprozess (per pcntl_fork) laufen und kann gleichzeitig das Response auf die Seitenanfrage ausliefern.
    Dies funktioniert auch ohne Probleme. Leider entstehen dabei Zombie Prozesse, da die Eltern den Status der Kinder nicht abholen (pcntl_waitpid) können.
    Nun gibt es daemon(3) <unistd.h> der dieses Problem lösen würde.

    Code:
    The daemon() function is for programs wishing to detach themselves from the controlling terminal and run in the background as system daemons.
    Leider habe ich dazu keine Implementierung in PHP gefunden.
    Habe ich da etwas übersehen? Gibt es eine Alternative?

    Vielen Dank und Grüße

  • #2
    Gearman wäre da eventuell eine Idee.

    http://gearman.org/
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      wenn der child sein job getan hat und nicht aufhören will, hau ich posix_kill drüber und gut:
      PHP-Code:
      if (function_exists('pcntl_fork') && function_exists('posix_kill') ){
          switch (
      $pid pcntl_fork()) {
            case -
      1:
              die(
      'Fork failed');
              break;
            case 
      0:
            
      // @child:

              // do something  

            
      posix_kill(getmypid(),9); // cleaning up child
              
      break;
              default:
           
      // @parent
          // got nothing to do then exit
         
      break;
         }

      Kommentar


      • #4
        @ChristianK Danke, schaue mir mal Gearman an.
        @moma Ich möchte ihn ja gerade weiterlaufen lassen.

        Kommentar


        • #5
          Du willst ein zombie weiterlaufen lassen?
          mach das.

          Kommentar


          • #6
            Zitat von melatonin Beitrag anzeigen
            [...] beim Laden einer Seite Aktionen (Cache etc.) ausführen möchte die etwas länger dauern. [...] Kindprozess (per pcntl_fork) laufen und kann gleichzeitig das Response auf die Seitenanfrage ausliefern. [...]
            @moma: So wie ich das interpretiere will er nicht den Zombie weiterlaufen lassen, sondern die länger dauernde Aktion.

            Beispiel: User ruft Seite "createLargeZipFile.php" auf. Seite wird dargestellt mit Ladebalken (AJAX und so) und im Hintergrund wird das Zip-File generiert.

            Nur bleiben bei ihm die Prozesse im Hintergrund nach dem Ende der Aktion (ZIP ist fertig) als Zombie bestehen. Das will er verhindern.
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              eben, und genau das macht der codeschnipsel von mir ja auch, nur dass er nach der action den prozess killt, um die pid aus der prozesstabelle des kernels zu kriegen.

              unschöner hack, geb ich zu, aber schnell irgendwo einzubauen, wenn man vorher nicht dran gedacht hat, was mir bei dem TE der fall zu sein scheint.

              Kommentar


              • #8
                @moma: Jetzt verstehe ich was du meinst. Könnte die Lösung sein.
                @ChristianK: Habe mir Gearman angeschaut und ist ein nettes Teil. Werde ich grundlegend im Auge behalten. Für die aktuelle Aufgabe aber nur teilweise geeignet.

                Kommentar


                • #9
                  Ich habe nun das Script mit posix_kill geschrieben. Dies wird per CLI ausgeführt.
                  Auf der Commandozeile funktioniert dies auch wunderbar.
                  Wenn ich dieses Script aber per "exec" oder "system" auf einer "Webseite" aufrufe blockiert der Befehl so lange, bis auch die Childs beendet wurden.
                  "nohup" bringt leider auch nichts.
                  Auf der "Webseite" kann ich nicht forken, da pcntl_* nicht für php module (nur cgi) verfügbar ist.

                  Hat jemand eine gute Idee?

                  Kommentar


                  • #10
                    Warum sollte nohup da auch was bewirken? Ampersand am Ende ist für Hintergrundprozesse, nohup um einen HangUp zu ignorieren.
                    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                    Kommentar


                    • #11
                      stimmt tkausl.
                      ich erwähne noch, dass:
                      Code:
                        shellcmd   > /dev/null 2>&1 &
                      ein brauchbarer aufruf ist, da dem TE sonst möglicherweise der output um die ohren fliegt.
                      http://stackoverflow.com/questions/4...-vs-cmd-log-21
                      hätte ich den link nicht gelesen ich hätrte es genau falsch gemacht.

                      Kommentar


                      • #12
                        Wieso sollte Ampersand was bewirken?
                        Hat bei mir das gleiche Verhalten. Der Aufruf blockiert leider trotzdem.
                        Nur weil er im Hintergrund ist, bewirkt dies ja nicht, dass der Parent beendet wird.

                        Kommentar


                        • #13
                          Zitat von melatonin Beitrag anzeigen
                          Wieso sollte Ampersand was bewirken?
                          Weil das den Prozess im Hintergrund startet.
                          Zitat von melatonin Beitrag anzeigen
                          Nur weil er im Hintergrund ist, bewirkt dies ja nicht, dass der Parent beendet wird.
                          Nein, aber dass der Parent nicht auf Beendigung wartet sondern einfach weiter macht.
                          [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                          Kommentar


                          • #14
                            Nur weil er im Hintergrund ist, bewirkt dies ja nicht, dass der Parent beendet wird.
                            was heisst das denn wieder, der parent beendet sich selbst, dachte ich.
                            wenn der child den parent killt, ist auch der child tot!

                            Kommentar


                            • #15
                              Vielleicht hilft dir ja das:
                              https://github.com/reactphp/react

                              LGL
                              https://github.com/Ma27
                              Javascript Logic is funny:
                              [] + [] => "", [] + {} => object, {} + [] => 0, {} + {} => NaN

                              Kommentar

                              Lädt...
                              X