dedlfix: Progessbar beim Downlaoden von Dateien (Ajax)

Beitrag lesen

echo $begrüßung;

Ein PHP-Skript läuft im Webserver relativ lange, da es mit set_time_limit() verlängert wird. Im selben Moment soll ein weiteres Skript aufgerufen werden. Da scheint allerdings vom anderen Skript blockiert zu werden, bis es fertig ist.

Das kann dann der Fall sein, wenn der Webserver so ausgelastet ist, dass er den zweiten Request gleich gar nicht berücksichtigen kann. Oder aber das zweite Script wird zwar gestartet, wartet aber freiwillig oder gezwungen auf die Freigabe der vom ersten Script belegten Ressource. Ebenfalls möglich ist, dass der Client sich blockiert hat weil er auf die Antwort des ersten Scripts wartet. Es ist eine gängige Einstellung in den Clients, die Anzahl der parallelen Requests zum gleichen Server einzuschränken.

Auf einem Server befinden sich Dateien. Benutzer können mit einem Webfrontend diese Dateien downloaden. Ein Client hat ebenfalls diese Software (ein kleines Webinterface) installiert und bei Bedarf kann der Client mit dem Server Daten austauschen.

Was genau muss man sich unter "kleines Webinterface installiert" vorstellen? Wenn es mehr ist als in einem herkömmlichen Browser angezeigtes HTML (evtl. gewürzt mit etwas Javascript) warum kann es dann nicht auf Ereignisse wie "wieder ein Stück Datei übertragen" reagieren und eine Fortschrittsanzeige bedienen?

Ich rufe per http_request ein Skript auf, welches die Datei lädt. Das Skript läuft natürlich relativ lange. Damit ich nun sehen kann, wieviel der Datei schon gedownloaded ist, macht ein anderer Http-Request im 2 Sek. Rhythmus eine Abfrage, wie groß die gedownloadete Datei bereits ist.

Ein HTTP-Prozess läuft auf dem Server normalerweise in einer gekapselten Umgebung ab und hat keinen Zugriff auf andere parallel laufende Requests. Möchte er Informationen an andere Prozesse zur Verfügung stellen müsste er das über einen gemeinsam zugreifbaren Speicherbereich (im RAM oder Dateisystem) tun.

Wenn du allerdings den Server befragst, wieviel er schon auf die Reise geschickt hat, muss das nicht unbedingt mit dem übereinstimmen, was schon beim Client gelandet ist. Unterwegs gelegene Zwischenspeicher könnten eine Differenz beherbergen.

Daraufhin hätte ich dann die Anzeige in einer Progressbar per JavaScript angezeigt. Der zweite HTTP-Request funktioniert allerdings nicht, denn die PHP-Seite, die hier aufgerufen werden soll, ist solange nicht aufrufbar, bis die Datei gedownloaded ist. Scheinbar blockt das eine Skript das andere Skript. Hat jemand eine Idee, was man hier machen kann?!?

Nicht ohne Einsicht in die derzeitige Implementation. Wobei ich diesen Weg zugunsten der oben angedeuteten Möglichkeiten nicht weiter verfolgen würde.

echo "$verabschiedung $name";