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
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
> 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
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
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
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/
> "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
>> "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
> 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