fork() oder sowas
am 01.08.2006 00:43:30 von Stefan+Usenet
Hallo,
es gibt da ein Programm, welches nach einer kurzen Vorverarbeitung
Feedback an den User zurueckgibt, um sich anschliessend einer
laengeren Beschaeftigung zu widmen. Um dem Anwender schneller eine
Seite ausliefern zu koennen (die bereits alle Informationen
enthaelt), kam die Idee auf, nach der Vorverarbeitung einen Prozess
abzuspalten, der - idealerweise mit dem exakt gleichen Environment -
unabhaengig die weitere Verarbeitung durchfuehrt, waehrend der erste
Prozess die Seite ausliefert und endet. Im Prinzip macht man so
etwas mit fork().
Dummerweise funktioniert aber pcntl_fork() nicht, wenn PHP als
Modul im Apache laeuft. Gibt es denn noch eine andere Funktion, mit
der das gewuenschte erreicht werden kann?
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktbörse fuer Österreich
Rasend bleibt rasend: Und dafuer Stefan!
(Sloganizer)
Re: fork() oder sowas
am 01.08.2006 08:39:17 von zirias
Hallo Stefan,
* Stefan Froehlich :
[Nicht interaktive Weiterverarbeitung in Kindprozess]
> Dummerweise funktioniert aber pcntl_fork() nicht, wenn PHP als
> Modul im Apache laeuft. Gibt es denn noch eine andere Funktion, mit
> der das gewuenschte erreicht werden kann?
Zunächst mal: Ist an sich klar. Wäre die Funktion in dem Kontext
definiert, müsste wohl oder übel der Apache Prozess kopiert werden, das
will man dann vielleicht doch nicht.
Mögliche Alternativen für dich:
1. Am Ende der Ausgabe ein flush(). D.h. alles wird gesendet. Lediglich
die Verbindung bleibt offen, d.h. der Browser wartet auf weitere Daten
bis das Script fertig ist, sollte aber trotzdem schon alles anzeigen.
Vielleicht lässt sich das noch elegant mit Output Buffering und einem
Content-Length Header lösen, wäre zu überprüfen.
2. Den nicht interaktiven Code in eine Funktion oder Methode packen und
register_shutdown_function() verwenden.
3. exec() verwenden um ein zweites Script mit CLI Interface aufzurufen,
im Kindscript sauber detachen: chdir zu /, umask 0, STD[IN|OUT|ERR] auf
/dev/null biegen, fork(), posix_setsid() im Kind. So grob. Hab ich nie
mit PHP probiert auÃerdem hast du da das Problem der Parameterübergabe.
GrüÃe, Felix
--
| /"\ ASCII Ribbon | Felix M. Palmen (Zirias) http://zirias.ath.cx/ |
| \ / Campaign Against | fmp@palmen.homeip.net encrypted mail welcome |
| X HTML In Mail | PGP key: http://zirias.ath.cx/pub.txt |
| / \ And News | ED9B 62D0 BE39 32F9 2488 5D0C 8177 9D80 5ECF F683 |
Re: fork() oder sowas
am 02.08.2006 07:57:11 von Stefan+Usenet
On Tue, 1 Aug 2006 08:39:17 +0200 Felix M. Palmen wrote:
> > Dummerweise funktioniert aber pcntl_fork() nicht, wenn PHP als
> > Modul im Apache laeuft. [...]
>
> Zunächst mal: Ist an sich klar. Wäre die Funktion in dem Kontext
> definiert, müsste wohl oder übel der Apache Prozess kopiert
> werden, das will man dann vielleicht doch nicht.
Schon klar. Aber aus rein funktionaler Sicht ist es aergerlich.
> Mögliche Alternativen für dich:
>
> 1. Am Ende der Ausgabe ein flush().
Das halte ich fuer sehr unelegant, manche Browser (alle?) zeigen
dann die Sanduhr, was den Anwender verwirrt.
> 2. Den nicht interaktiven Code in eine Funktion oder Methode
> packen und register_shutdown_function() verwenden.
Hm. Damit sollte es klappen. Es braucht zwar ein paar Aenderungen
am grundlegenden Design (es kann kein Prozess im verarbeitenden
Unterprogramm abgespalten werden, sondern die Verzweigung muss am
Ende des Hauptprogramms stehen), aber es sollte sich im Rahmen
halten.
> 3. exec() verwenden um ein zweites Script mit CLI Interface
> aufzurufen,
Das hat, wie Du sehr richtig schreibst, das grosse Problem der
Parameteruebergabe - die Loesung haette ich als allerletzten Ausweg
im Hinterkopf gehabt.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktbörse fuer Österreich
Die Kraft, Frieden zu spenden - Stefan: toben, welch verdrängtes Sehnen!
(Sloganizer)
Re: fork() oder sowas
am 10.08.2006 15:24:20 von Stefan+Usenet
On Tue, 1 Aug 2006 08:39:17 +0200 Felix M. Palmen wrote:
[PHP laeuft nach Beenden der Verbindung zum Browser weiter]
> Mögliche Alternativen für dich:
> 1. [Workaround mit Content-Length Header
Ist nach wie vor nicht gut.
> 2. Den nicht interaktiven Code in eine Funktion oder Methode
> packen und register_shutdown_function() verwenden.
Damit das auch noch im Usenet zu finden ist: diese Moeglichkeit hat
bis PHP 4.0.6 (unter Unix/Apache) funktioniert, nun aber nicht mehr.
Diskutiert wurde das unter .
Dort wird auch eine Funktion apache_register_shutdown_function mit
dem originalen Verhalten versprochen, die es aber offenbar nie in
eine stabile Version geschafft hat - trotz zahlreicher Nachfragen.
> 3. exec() verwenden um ein zweites Script mit CLI Interface
> aufzurufen, im Kindscript sauber detachen: chdir zu /, umask 0,
> STD[IN|OUT|ERR] auf /dev/null biegen, fork(), posix_setsid() im
> Kind. So grob.
Folglich bleibt nur noch dieser Weg uebrig, so unelegant es auch
zu programmieren sein mag.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktbörse fuer Österreich
Stefan - Wen die Götter verderben wollen...
(Sloganizer)