2008-11-25 12 views
7

Ich schreibe eine einfache Anwendung in PHP, die gelegentlich eine ziemlich intensive Reihe von MySQL-Updates durchführen muss. Ich möchte nicht, dass dies eine Verzögerung für den Benutzer verursacht, also frage ich mich über pcntl_fork().Ist Forking in PHP/Apache eine gute Idee?

Ich bin nicht sicher, wie das wirklich funktioniert: Wird der Kindprozess weiter ausgeführt, nachdem der Elternprozess abgeschlossen ist? Wird der Elternprozess beendet und die Seite wird vollständig geladen, bevor der Kindprozess abgeschlossen wird?

Mit anderen Worten, ist dies ein sicherer Weg, um ein PHP-Skript (läuft unter Apache) einige zeitaufwendige Updates ohne Verzögerung des Benutzers zu machen, oder sollte ich nur meine Benutzer bitten, mit etwas Verzögerung zu ertragen?

+0

Bitte machen Sie im Fragetitel deutlich, dass Sie einen Prozess forkieren wollen. Ich dachte zuerst, du willst das Projekt abzweigen. –

+0

Stimmen Sie mit phjr überein. Kann jemand den Titel bearbeiten? – OIS

Antwort

3

Der übergeordnete Prozess wird beendet, die Benutzerseite wird vollständig geladen, der untergeordnete Prozess wird fortgesetzt, und die Benutzer erhalten keine Rückmeldung darüber, ob der untergeordnete Prozess erfolgreich abgeschlossen wurde oder nicht.

1

Jemand da draußen kann Ihnen wahrscheinlich im Detail sagen, was passiert, wenn Sie das unter Apache nennen, aber die Chancen sind, dass Sie Antworten erhalten werden, die nicht immer wahr sind, je nachdem, welche Versionen und Kombinationen von Apache und PHP Sie verwenden. Sie sollten Ajax verwenden und zwei Anfragen haben. Antworten Sie einmal mit der Seite, die sagt, was Sie tun, und dann mit einem Ajax-Anruf eine zweite Anfrage für den Status und wo Sie tatsächlich die Arbeit erledigen.

0

Wenn PHP unter Apache läuft, da mod_php Modul Forking überhaupt nicht funktioniert, erhalten Sie eine Warnung, dass die Funktion * pcntl_fork() * nicht definiert ist. In diesem Fall ist eine gute Lösung, stattdessen exec() zu verwenden, um einen separaten PHP-Auftrag über die Befehlszeile auszuführen.

0

Ich denke, es ist eine schlechte Idee. Ich habe ähnliche Sachen gemacht, und die Apache leiten den Ausgang des Elternteils zu seinem Kind um. Das ist Ihr Browser zeigt die Informationen von einem der Kindprozess.
Klicken Sie auf this für weitere Informationen
Ich hoffe, es hilft Ihnen.