2011-01-17 11 views
1

Ich habe ein PHP-Skript geschrieben, das eine Anfrage an eine Suchmaschine stellt, auf die gelieferten Ergebnisse zugreift, einige Details aus den Ergebnissen extrahiert und sie dann in einer nützlicheren Form druckt.Streamingdruck mit PHP

Alles funktioniert gut, aber etwas, das ich durch Zufall entdeckt habe, ist, dass das Echo oder Drucken während des Wartens darauf, dass Daten gestreamt werden, dazu führen kann, dass die Ausgabe ebenfalls gestreamt wird. Insbesondere gibt es mehrere Ergebnisseiten, also greife ich auf die erste Seite zu, lese den Inhalt ein und drucke ihn erneut aus, gehe dann zur nächsten Seite über, und während ich darauf warte, dass die nächste Seite geladen wird, wird der Inhalt der vorherigen Seite sichtbar der Browser.

Was ich nicht verstehe ist, warum dies so inkonsequent passiert. Manchmal wird genau eine Seite gedruckt, bevor auf die nächste Seite gewechselt wird, manchmal weniger und manchmal mehr. Wenn ich danach im Grunde dasselbe mache (auf der Seite, auf die jedes Ergebnis zeigt), wird die Ausgabe kaum gestreamt und wird jede Minute neu gezeichnet.

Ich benutze file_get_contents($url), um den Inhalt abzurufen, und eine Funktion mit einem echo darin aufrufen, um zu drucken, was bisher geladen wurde. Ist das Streaming-Druckverhalten ein Feature des Browsers und unabhängig davon, was ich in PHP schreibe? Wenn nicht, wie kann es besser kontrolliert werden?

Antwort

5

Die einfachste Lösung ist die Verwendung output buffering. Die Grundidee besteht darin, am Anfang des Skripts ob_start() aufzurufen und dann ob_end_flush() aufzurufen, wenn der Inhalt der Seiten an den Client gesendet werden soll. Dadurch speichern Sie Ihre gesamte Ausgabe, bis Sie möchten, dass Ihr Programm sie sendet.

+0

Danke, das scheint sicherlich das zu sein, was ich suchte, aber es funktioniert immer noch nicht ganz wie erwartet. Ich habe die Dokumentation und die Kommentare gelesen, habe am Anfang alles hundertmal geleert und habe nach jedem interessanten Druck ein ob_flush(), aber es druckt immer noch in seltsamen Intervallen (alle 13 Ergebnisse, wenn es 10 pro Seite gibt). Könnte ein Problem mit der Chunk-Größe sein? Ich habe es auf 3 Bytes in php.ini eingestellt, also sollte es behoben sein. Vielleicht sollte ich den Server neu starten ... – orlade

+0

Könnte es ein Problem mit Ihrem Algorithmus geben? Ansonsten bin ich nicht sicher, warum es alle 13 Ergebnisse drucken würde. Vielleicht ist da etwas Seltsames mit deinem Webserver los? – GWW

+1

Ah, hab es. Ich musste 'ob_flush();' und dann 'flush();' auch nennen (in dieser Reihenfolge, glaube ich), nicht nur das eine oder das andere, und das musste ich jedes Mal tun. Verwirrendes Zeug. Funktioniert jetzt perfekt, danke! – orlade