Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Parallelprozesse mit Rückgabe: Best Practice?

0 views
Skip to first unread message

Oliver

unread,
Nov 6, 2009, 8:37:04 AM11/6/09
to
Guten Tag miteinander

Ich möchte mir - konzeptionell - ein Beispiel erstellen, welches
Rückgabewerte direkt ausgibt (klassischerweise im Browser) anstatt auf
das Ende der Funktion zu warten.

Beispiel:
------------
for ($i = 0; $i < 9; $i++ )
{
echo "Counter: ".$i ;
}

Bei diesem Beispiel erhalte ich eine Ausgabe, sobald der Zähler 9
erreicht hat.

Ziel:
------
Nun möchte ich bei jedem Durchlauf eine Ausgabe erhalten anstatt nur
am Ende.

Erste Überlegungen:
------------------------------
1. Aufrufe per JavaScript
Ich habe mir gedacht, dass ich die Funktionen über JavaScript (Ajax)
aufrufen könnte. Allerdings sind mir die JS Konstrukte nicht geläufig
und ich finde - gefühlsmässig - dass das der falsche Ansatz ist (ich
mag die Programmiersprachen auch nicht mischen, wenn möglich).
Ausgenommen, dass ich wohl nicht um einen "Container" für die Ausgabe
im Browser herum komme.

2. Forken des Prozesses
Ich halte diesen Ansatz für den "richtigeren". Ich könnte die
Prozesse/ Funktien forken und die Ausgabe in ein Browserobjekt geben.


Frage:
----------
Wie macht ihr das? Best practice?
Meine Frage geht mir weniger um die Technische Umsetzung als eben, was
denn der beste (oder bessere) Ansatz ist.


Grüsse
Oliver

Matthias P. Wuerfl

unread,
Nov 6, 2009, 10:20:29 AM11/6/09
to
Hallo!

Ich verstehe nicht, was Du willst, denn...

> Beispiel:
> ------------
> for ($i = 0; $i < 9; $i++ )
> {
> echo "Counter: ".$i ;
> }
>

> Bei diesem Beispiel erhalte ich eine Ausgabe, sobald der Z�hler 9
> erreicht hat.

Nein, so ist das nicht, sondern...

> Ziel:
> ------
> Nun m�chte ich bei jedem Durchlauf eine Ausgabe erhalten anstatt nur
> am Ende.

So ist das. Normal. Standard.

Gr��e, Matthias

Claus Reibenstein

unread,
Nov 6, 2009, 10:42:05 AM11/6/09
to
Matthias P. Wuerfl schrieb:

> Ich verstehe nicht, was Du willst, denn...

Wer ist "Du"?

>> Beispiel:
>> ------------
>> for ($i = 0; $i < 9; $i++ )
>> {
>> echo "Counter: ".$i ;
>> }
>>
>> Bei diesem Beispiel erhalte ich eine Ausgabe, sobald der Z�hler 9
>> erreicht hat.
>
> Nein, so ist das nicht, sondern...

Ich vermute mal, dass der omin�se "Du" (dessen Posting vermutlich in
meinem Filter h�ngen geblieben ist) seinen Code nicht per Copy&Paste
�bernommen hat, wie man es allgemein tut bzw. tun sollte, sondern
abgetippt hat und dabei seinen Fehler, den wir nun nicht sehen k�nnen,
automatisch korrigiert hat.

Gru�. Claus

Oliver

unread,
Nov 6, 2009, 11:04:53 AM11/6/09
to
On 6 Nov., 16:42, Claus Reibenstein <4spamerso...@kabelmail.de> wrote:
> Matthias P. Wuerfl schrieb:
>
> > Ich verstehe nicht, was Du willst, denn...

Ich möchte eine Unterhaltung über die Best-Practice des parallelen
Ausführens und Anzeigen von Ausgaben an den Browser über Apache mit
PHP mod.

...

>
> Ich vermute mal, dass der ominöse "Du" (dessen Posting vermutlich in
> meinem Filter hängen geblieben ist) seinen Code nicht per Copy&Paste
> übernommen hat, wie man es allgemein tut bzw. tun sollte, sondern
> abgetippt hat und dabei seinen Fehler, den wir nun nicht sehen können,
> automatisch korrigiert hat.
>
> Gruß. Claus

Ich hoffe doch, es hat keinen Fehler in meinem FOR-Beispiel! ;-)

Grüsse
Oliver

Oliver

unread,
Nov 6, 2009, 11:18:50 AM11/6/09
to
On 6 Nov., 16:20, "Matthias P. Wuerfl" <matth...@wuerfl.com> wrote:
> Hallo!
>
> Ich verstehe nicht, was Du willst, denn...
>
....
> > Bei diesem Beispiel erhalte ich eine Ausgabe, sobald der Zähler 9

> > erreicht hat.
>
> Nein, so ist das nicht, sondern...
>
> > Ziel:
> > ------
> > Nun möchte ich bei jedem Durchlauf eine Ausgabe erhalten anstatt nur

> > am Ende.
>
> So ist das. Normal. Standard.
>
> Grüße, Matthias

Danke für Deine Antwort.

Ja, da hast Du recht. Die Wahl meines Beispieles ist ungeschickt bzw.
zu rudimentär.

Neuer Anlauf:
"FOR" wird ausgeführt, nachdem eine Clientseitige Anfrage gestartet
wurde.
Das Ergebnis erscheint nun erst, wenn die FOR-Funktion ihr Ende
erreicht hat.

Oder etwas näher an der Praxis:
=> HTML Formular => Request an Server => Ausführen Server Code seriel
Resultat an Browser <=

=> HTML Formular => Request an Server => Ausführen Server Code
parallel
Resultat an Browser <=
Resultat an Browser <=
Resultat an Browser <=

Abgesehend davon ist mir nicht das technische Vorgehen wichtig,
sondern es interessiert mich, "wie das konzeptionell so im allgemeinen
gemacht wird".

Grüsse
Oliver

Grüsse
Oliver


Oliver

unread,
Nov 6, 2009, 11:36:25 AM11/6/09
to
On 6 Nov., 14:37, Oliver <mykl...@gmail.com> wrote:
> Guten Tag miteinander
...

>
> Frage:
> ----------
> Wie macht ihr das? Best practice?
> Meine Frage geht mir weniger um die Technische Umsetzung als eben, was
> denn der beste (oder bessere) Ansatz ist.
>
> Grüsse
> Oliver

Nun, ich beantworte meine Frage mal selber in der DU-Form.
So, wie Du das willst geht das nicht. PHP die Prozesse im Apache nicht
parallel laufen haben.

Du kommst nicht drum herum, die Funktionen entweder extern auf zu
rufen oder die Ausgaben im Hintergrund über (Text)Dateien (oder DB
Einträge) zu lesen. Ja, das ist NICHT was Du wolltest weil man dann
irgendwie die Ausgabe ja nicht weiss, an welchen Browser auf der Welt
sie soll.

Eine Lösung schlägt Julian über das Verwenden von Logdateien vor [1].

Wenn Du wirklich direkt eine serverseitige Rückgabe von Werten in der
GUI willst, empfehle ich Dir, Dich in AJAX ein zu lesen.

Die Ansätze (bzw Workarrounds), die Du dir überlegt hast, sind also
schon richtig. Go ahead. Noch ein Tip: Google -> "php popen"

Grüsse
Oliver an Oliver

[1] Gi-Blog
http://blog.gi-project.de/2009/07/multithreading-in-php/

Matthias P. Wuerfl

unread,
Nov 7, 2009, 8:17:49 AM11/7/09
to
Oliver schrieb:

> "FOR" wird ausgef�hrt, nachdem eine Clientseitige Anfrage gestartet


> wurde.
> Das Ergebnis erscheint nun erst, wenn die FOR-Funktion ihr Ende
> erreicht hat.

Nein, w�hrenddessen.

> Oder etwas n�her an der Praxis:
> => HTML Formular => Request an Server => Ausf�hren Server Code seriel
> Resultat an Browser <=

Nein.

> => HTML Formular => Request an Server => Ausf�hren Server Code


> parallel
> Resultat an Browser <=
> Resultat an Browser <=
> Resultat an Browser <=

Ja.

Gr��e, Matthias

Matthias P. Wuerfl

unread,
Nov 7, 2009, 8:23:38 AM11/7/09
to
Matthias P. Wuerfl schrieb:

>> "FOR" wird ausgef�hrt, nachdem eine Clientseitige Anfrage gestartet
>> wurde.
>> Das Ergebnis erscheint nun erst, wenn die FOR-Funktion ihr Ende
>> erreicht hat.
>
> Nein, w�hrenddessen.

Das kannst du doch einfach �berpr�fen:

<?php
// Leitung freipusten f�r IE
while($i= 0 ; $i < 1024 ; $i++ ){
echo " ";
}
// Jetzt der eigentliche Test

while($i= 0 ; $i<100 ;$i++){ // 100 mal sollte reichen, he?
echo "foo $i"; // Ausgabe
flush(); //Und weg damit zum Browser
sleep(1); // Eine Sekunde warten
}

?>

Gr��e, Matthias

Oliver

unread,
Nov 9, 2009, 6:54:00 AM11/9/09
to
On 7 Nov., 14:23, "Matthias P. Wuerfl" <matth...@wuerfl.com> wrote:
> Matthias P. Wuerfl schrieb:
>
> >> "FOR" wird ausgeführt, nachdem eine Clientseitige Anfrage gestartet

> >> wurde.
> >> Das Ergebnis erscheint nun erst, wenn die FOR-Funktion ihr Ende
> >> erreicht hat.
>
> > Nein, währenddessen.
>
> Das kannst du doch einfach überprüfen:
>
> <?php
> // Leitung freipusten für IE

> while($i= 0 ; $i < 1024 ; $i++ ){
>         echo " ";}
>
> // Jetzt der eigentliche Test
>
> while($i= 0 ; $i<100 ;$i++){ // 100 mal sollte reichen, he?
>         echo "foo $i"; // Ausgabe
>         flush(); //Und weg damit zum Browser
>         sleep(1); // Eine Sekunde warten
>
> }
>
> ?>
>
> Grüße, Matthias

Hi Matthias

Danke für Dein (sehr gutes) Beispiel.

Meine Problemstellung war wohl falsch.
Ahh; ich sehe, Du verwendest Flush. Ich werde damit einige Versuche
tun.

Neues Beispiel:
---------------------------

for( $i= 0 ; $i<100 ; $i++)
{ // Ich mag die Klammern lieber unten

echo "foo $i \n"; // Ausgabe

MeineFunktion($i);

flush(); //Und weg damit zum Browser

}

function MeineFunktion($i)
{
echo "Bar: $i \n";
}


Frage:
----------
Wird auf die Funktion "MeineFunktion()" gewartet (sequentiell) oder
wird die Funktion (im schnellsten Fall) 100 Mal gleichzeitig
ausgeführt?

Meinen Untersuchungen nach, wird die Funktion sequentuell abgearbeitet
(allerdings habe ich FLUSH nich versucht); welche Konzepte verfolgt
ihr um ein paralleles Abarbeiten zu erreichen?

Grüsse
Oliver

Ziel:
Die Funktion

Oliver

unread,
Nov 9, 2009, 6:57:44 AM11/9/09
to
...

> Frage:
> ----------
> Wird auf die Funktion "MeineFunktion()" gewartet (sequentiell) oder
> wird die Funktion (im schnellsten Fall) 100 Mal gleichzeitig
> ausgeführt?
>
> Meinen Untersuchungen nach, wird die Funktion sequentuell abgearbeitet
> (allerdings habe ich FLUSH nich versucht); welche Konzepte verfolgt
> ihr um ein paralleles Abarbeiten zu erreichen?

Sehe und lese:
http://php.net/manual/de/function.flush.php

>
> Grüsse
> Oliver
>
> Ziel:
> Die Funktion- Zitierten Text ausblenden -

Danke Mathias; ich denke ich sollte nun meine Idee umsetzen können:
FLUSH war, was ich suchte.
(und sonst komm ich wieder) ;-)

Grüsse
Oliver

0 new messages