Hallo!
Wollte mich dann auch mal mit der Prozessverwaltung in PHP mittels http://www.php3.de/manual/de/ref.pcntl.phpversuchen. Kennt vielleicht jemand eine gute und vor allem _einfach_zu_verstehende_ Quelle um mal ein paar Grundlagen zur Thread-/Prozessverwaltung von Linux zu lernen?
Ich verstehe nämlich leider nichtmal die kurze Erklärung im PHP-Manual komplett:
On success, the PID of the child process is returned in the parent's thread of execution, and a 0 is returned in the child's thread of execution. On failure, a -1 will be returned in the parent's context, no child process will be created, and a PHP error is raised.
OK: Bei Erfolg wird dem Eltern/Vater-Thread die Prozess-ID des Kinder-Prozesses zurückgegeben, eine "0" wird dem Kinder-Thread zurückgegeben, und ein "-1" bei Fehler. Dazu steht da folgendes Beispiel:
Beispiel 1. pcntl_fork() Example
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if ($pid) {
// we are the parent
} else {
// we are the child
}
?>
Was ich daran nicht verstehe, das eine Script hat erstmal nur einen Thread und einen Prozess. Dann wird durch fork ein Kinderprozess gestartet. Was ich nicht verstehe - wenn man mal den Fehler (-1) außen vorläßt - steht da eine Weiche, entweder $PID ist 0 oder hat eine Nummer > 0. Aber beides ist wahr, es gibt ja jetzt 2 Threads bzw. Prozesse, laufen dann beide Prozesse durch diese Weiche, der eine in die eine Richtung, der andere in die andere Richtung? Laufen dann also 2 Prozesse in ein und demselben Script? Da steht immer "gibt XY dem einen oder dem anderen Thread zurück", aber das Script gehört doch ausschließlich dem Vater-Thread, oder? Und anhand der PID kann man im Script drauf reagieren? Einmal geht das innderhalb der Weiche, klar, aber wenn ich danach auf einen speziellen Prozess zugreifen will, kann ich ja nicht mehr PID=0 verwenden, denn das gilt ja für alle Kinderprozesse, oder? Könnte man so auch später im Script alle Kinderprozesse gleichzeitig ansprechen? Über die PID kann man die Kinderprozesse ja nachdem ob die IF-Weiche zu Ende ist ja nur noch beenden, oder? Oder könnte ich auch später im Script einen speziellen Kinderprozess dazu veranlassen einen bestimmten PHP-Code auszuführen?
Und was ist der Unterschied zwischen einem Prozess und einem Thread? Prozess ist doch das was mir z.B. der Windows Task-Manager anzeigt, oder? Aber was ist jetzt ein Thread?
Ich versuche gerade nämlich mal ein Testscript zu schreiben, welches so viele Socketverbindungen wie möglich zu demselben externen Server herstellt(HTTP-GET Request). Vorab, was ist hier eigentlich der Vorteil vieler Prozesse, im Gegensatz zu einer Schleife in einem Prozess? PHP kann doch sowieso nur eine begrenzte Anzahl von Befehlern bearbeiten und wird die Prozesse doch auch in einer Warteschlange-schieben und nacheinander abarbeiten, oder? Oder muß man hierbei nicht jedesmal auf den Response des HTTP-Request warten?
Jedenfalls habe ich mir das so vorgestellt:
for($i=1;$i<10;$i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("could not fork");
} else if (!$pid) {
for($j=1;$j<100;$j++) {
fsockopen(...);
fputs(...);
}
}
}
Würde das schon reichen, oder ist das Quatsch? Wieviele Prozesse verwendet man für so etwas erfahrungsgemäß?
Hat jemand schonmal pcntl-Funktionen bei PHP eingesetzt? Dazu muß ich doch PHP selbst kompilieren, mit --enable-pcntl wenn ich das richtig verstanden habe, oder?
Viele Grüße
Andreas