Lange Ladezeiten (PHP/JavaScript)

Nagilo

Mitglied
Ich hab bisher keinen Eintrag zu diesem Thema gefunden, daher hier mein Problem.

Problem:

In einem Script parse ich mit PHP recht große Dateien (> 30MB) durch, dessen Ergebnis dann im Webbrowser dargestellt wird. Das Parsen dauert da schonmal mehr als 1 Minute. Aus diesem Grund habe ich eine Art Fortschrittsbalken eingebaut. Dieser wird über eine JavaScript-Funktion eingestellt. Beim Parsen schreibe ich per PHP also alle 100 KiloByte eine Zeile die dem Browser sagt, führe jetzt diese JavaScript Funktion mit diesem Wert aus.

Soweit so gut, nur leider kapiert der Browser das nicht ganz, da er die Seite erst darstellt, wenn ich per PHP komplett das </body> </html> übertragen habe, aber dann ist der Fortschritt natürlich gleich bei 100%.

Frage:

Kann ich dem Browser irgendwie beibringen, daß er das bisher übermittelte Document jetzt soweit erstmal ausführt und darstellt, obwohl der Rest des Documents noch per PHP berechnet wird?

Schonmal vielen Dank für die Hilfe.
 
Nö... das Ergebnis eines PHP-Skripts wird erst an den Clienten gesendet, wenn das Skript komplett abgearbeitet ist.... vorher gibts da keine Kommunikation.
 
Natürlich ist es möglich, Inhalte schon vorher an den Browser zu senden.
Per flush(). Ob der Browser die empfangenen Inhalte dann aber in jedem
Fall anzeigt, ist eine andere Frage.

Peter
 
Also erstmal danke für die schnelle Antwort.

flush() geht zwar in die richtige Richtung, funktioiert aber nicht. PHP sendet auch vorher schon den Code, den ich per "echo" ausgeben lassen an den Browser. Dies kann man sehen, wenn man beim Laden sich den Source-Code ansieht, der dann natürlich nicht ganz vollständig ist.
Leider führt der Client (Webbrowser) in diesem Stadion aber nicht die JavaScript-Befehle aus.

Anmerkung:

Mir ist eben ein Lösung eingefallen, die auch gut funktioniert. Statt nach jeden 100kb einen JavaScript-Befehle auf den Output zu schreiben, schreibe ich jetzt ein Image (1x1, weiß), bei welchem onLoad dann der JavaScript Befehl zum Anpassen des Fortschrittsbalkens ausgeführt wird.
Das klappt sogar richtig gut, auch wenn es eher umständlich ist.

PS: Damit das geht, muß man nach jeder Ausgabe des Bildes auch ein flush() machen.
 
Zuletzt bearbeitet:
Danke für den Hinweis. Dort ging es ja tatsächlich um das gleiche Problem, aber den dort gefundenen Code finde ich nicht so super brauchbar.

Also hier mal meine Zusammenfassung:

a) Es geht nur in Kombination von PHP und JavaScript.

b) Meine Lösung:

- ein Statusbalken als DIV, dessen Länge über eine JavaScript-Funktion geändert wird
- Im PHP Script in gewissen Zeitabständen per "echo" oder "print" ein Bild ausgeben, bei dem onLoad die JavaScript Funktion ausgeführt wird
- danach in PHP flush() ausführen.
- die Zeitabstände sollten nicht zu dicht beieinander liegen, da sonst die Netzwerkverbindung beeinträchtigt wird.

Konkret zähle ich bei mir die eingelesenen Bytes der Logfiles und alle 5MB sende ich eine Zeile in etwa wie folgt:

echo '<img src="./pic/1x1white.jpg" onLoad="set_progress('.$new_percent.')">';


Ich hoffe die Lösung hilft auch anderen. Über bessere und eventuell performantere Lösungsvorschläge bin ich jederzeit dankbar.
 
Zurück