phpbar.de logo

Mailinglisten-Archive

[php] nochmal functionproblem

[php] nochmal functionproblem

Hartmut Holzgraefe hartmut_(at)_six.de
Fri, 18 Aug 2000 16:12:57 +0200


"Listor, Listornet" wrote:
 
> wenn du php programmieren kannst wirst du wohl noch das
> bischen code verstehen oder ist das zu hoch ?

das 'bischen' code sieht recht übel aus, ich war mir auf
den ersten Blick nicht einmal sicher ob/wann das flush()
überhaupt erreicht wird

> meine frage war doch wohl klar formuliert ?!?

die Frage ja, der Code nein


> ich hab die funktion mitgeschickt damit man eventuelle
> fehler entdeckt

es ist in solchen Fällen üblich, sich die Mühe zu machen,
den Code auf das Wesentliche zu reduzieren, damit eventuelle
Freiwillige, wenn sie schon das Debugging für dich übernehmen,
nicht zu viel unnötige Zeit investieren müssen ...

ok, ich habe mir jetzt die Mühe gemacht, das Rundherum um
das flush() zu durchschauen

und was muß ich da sehen? Busy-Waiting! So etwas ist zunächst
eimal nur schlechter Stil, in einer Multitasking- und insbesondere
Multiuser-Umgebung dagegen sträflich.

D.h. du verbrauchst je ausgegebenem Zeichen eine ganze Sekunde 
CPU-Zeit(!), und das außerdem noch für einen äußerst zweifelhaften
Zweck, den der Anwender auf der Browserseite weis i.A.
schon selbst, wie schnell er lesen kann.

Wenn's denn trotztdem sein muß, dann bitte so:

function einZeichenJeSekunde($wort) {
  if(!empty($wort)) {
    $len = strlen($wort);
    for($i=0;$i<$len;$i++) {
      echo substr($wort,$i,1);
      flush();
      sleep(1);
    }
  }
}

das ist erstens Resourcen-sparend, zweitens hätten wir uns
die vorigen beiden Mails sparen können

> und mir sagt woran es liegen könnte, 
> daß flush beim ersten aufruf der seite nicht läuft aber wenn
> man die seite refresht dann doch so wie es soll.

Auf dem Weg vom Script zum Browser gibt es mehrere Instanzen,
die ihre eigenen Puffermechanismen betreiben, um eine effektive
Übertragung zu gewährleisten

flush() leert nur den PHP-Internen Puffer, danach müssen noch 
der Webserver, eventuelle Proxies und der Browser durchlaufen 
werden. Oft werden Eingangsdaten zb.b nur Zeilenweise verarbeitet,
damit nicht für jedes einzelne Byte ein TCP-Packet auf die
Reise geschickt werden muß (in dem dann 98.5% der Minimalgröße
nicht genutzt werden, sondern als Ballast mitwandern)


dazu kommt noch, das bei einem einfachen Refresh im Browser
oft einfach nur der bereits vorhandene HTML-Code noch einmal
angezeigt wird, ein echter Reload läßt sich zum Bespiel bei
Netscape mit SHIFT-Reload erzwingen, den IE kenn ich nicht


Lange Rede, kurzer Sinn:

  versuchs mal mit 'nem '\n' hinter dem Echo
  und hoffe, das dein Provider niemals auf die
  Idee kommt, nach verbrauchter Rechenzeit abzurechnen


<grummel/>


PS: fällt "Obenquoter" eigentlich in die selbe Kategorie wie
    "Schattenparker"?



--
Hartmut Holzgraefe         
  hartmut_(at)_six.de     http://www.six.de    +49-711-99091-77 fax:-99


php::bar PHP Wiki   -   Listenarchive