Wie funktioniert pcntl_fork()

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

  • Wie funktioniert pcntl_fork()

    Hallo,

    das was in man fork und in der PHP Dokumentation steht, verstehe ich nicht. Gibts da irgendwie ein besseres "Tutorial", was das ganze einleuchtend an Beispielen erklärt?

    Gruss

  • #2
    Ich kenne keine bessere Erklärung als auf php.net.
    Ist doch ganz einfach: Du startest ein Script, d.h. du startest einen phpcli-prozess (mit mod_php gibts kein fork, denn das ist selbst nur Teil eines httpd-Prozesses) mit allem drum und dran - prozess-id, code- und datensegment im speicher etc.
    Der Prozess reitet nun einige Zeilen des PHP-Scripts ab, verändert dabei bestimmt auch etwas im Speicher und irgendwann kommt der pcntl_fork-Aufruf.
    Nun stoppt sich der Prozess und kopiert sich 1:1. (Unter Unix/Linux mit einem fork()-Call.) Er alloziert also genau soviel Speicher, wie der Originalprozess hat und schreibt dort den momentanen Inhalt des eigenen Speichers rein.
    Einziger Unterschied zwischen beiden Prozessen ist nun die PID, den irgendwie muß das Betriebssystem die Krabbelgruppe ja verwalten.
    Da der PHP-Code auch in dem kopierten Speicher lag, führen jetzt beide Scripte das gleiche aus, kommen auf die gleichen Ergebnisse und werden (ungefähr) zur gleichen Zeit fertig.
    Indem man abhängig von der eigenen PID verzweigt (mit IF), kann man sie aber doch verschiedenen Code ausführen lassen. Und das ist auch schon der einzige Grund für ein fork - man möchte zur selben Zeit, parallel, zwei Codestränge laufen lassen.

    Aber deine Scripte werden nicht schneller sondern langsamer, wenn du sie klonst. Es sei denn du läufst auf einer Multiprozessor-Architektur (das ist mehr als ein P4 ).

    Was hast du denn vor?
    Zuletzt geändert von onemorenerd; 07.06.2005, 02:10.

    Kommentar


    • #3
      Hi,

      das ist mein System


      Von der Leistung her, sollte es kein Problem geben, denke ich!

      Nun zu dem eigentlichen:

      Prinzipell möchte ich eine Datenbank von oben bis unten unendlich mal (fester server daemon prozess) == while(1) {} durchgehen und Daten auslesen und eine bestimmte aufgabe möchte ich an mehere Prozesse weitergeben, die die Funktion dann abarbeiten.

      Vereinfacht dargestellt:

      lesedatenbankaus();
      if(eintraggefunden() == 1)
      {
      macheneuenprozess() der die funktion xyz() abarbeitet und wenn er fertig ist, den Prozess sauber schließt!
      }

      Das ganze sollte nichtsdestotrotz sehr "resourcenschonend" laufen. Ich weiss, dass PHP nicht die geeignetste Sprache für dieses Problem ist, allerdings habe ich keine anderen Fähigkeiten, die ausreichend beherrsche.

      Du, weisst was ich meine?

      Gruss

      Kommentar


      • #4
        Du willst also auf Änderungen in einer DB reagieren.
        Wie kommst du da auf fork()?

        Bei der Hardware läuft doch sicher Oracle oder DB2, die können per Trigger ein Programm starten. Vielleicht genügts auch, stored pocedures zu triggern.

        Kommentar


        • #5
          Hi,

          nein. Ich spreche eine stinknormale modfied MySQL Datenbank an. Die ist fast standard.
          Ich möchte nunmal kontinuierlich Daten auslesen und wenn ein bestimmter Fall zutrifft (if(){}) dann mit einem neuen Prozess interagieren.

          Bis jetzt dachte ich mir, ich öffne per exec() immer wieder ein neues Skript, was per $SERVER Parameter argumente bekommt.

          Gruss

          Kommentar

          Lädt...
          X