Dennis: Progessbar beim Downlaoden von Dateien (Ajax)

Beitrag lesen

Hi DanielE,

Hier noch einmal ein paar detailiertere Infos zur Technik, die ich verwenden möchte bzw., wie ich mir das vorstelle. Also ich lade eine Datei per FTP mittels PHP von einem Server runter. D.h. das PHP auf dem Server, welches ich per Browser aufrufe, läuft etwa 3-4 min, bis die Datei fertig geladen hat. Das Problem ist, dass ein Benutzer, der davor sitzt, natürlich ungeduldig wird, da das ganze so lange dauert.

Hm... Wie dedlfix schon erwähnt hat, stößt du hier vielleicht auf das Problem, dass die Anzahl der Verbindungen, die ein Client zu ein- und demselben HTTP-Server erlaubt, beschränkt ist. Soweit ich das sehe, hast du zwar eigentlich nur 2 Verbindungen auf, aber möglicherweise liegt es auch ein einem Proxy, einem Router oder an einer Firewall dazwischen - was weiß ich ;-)

Jedenfalls hätte ich noch eine andere Idee, wie du das implementieren könntest. Eigentlich brauchst du den Clienten ja nicht so ewig lang an dieser einen AJAX Verbindung hocken lassen, wo der Client dann 3-4 Minuten nichts empfängt und nur warten darf.

Du könntest dich also mal mit den Prozess Kontroll-Funktionen auseinandersetzen. Ich denke da z.B. an folgendes Szenario: Bevor du den Transfervorgang per FTP startest, forkst du deinen PHP-Prozess und lässt ihn im Hintergrund des Servers weiterlaufen. Im Hintergrundprozess lässt du dann den FTP-Transfer laufen, der erste Prozess, an dem der Client sozusagen dranhängt kann sich dann einfach beenden und dem Clienten noch die Prozessnummer des Hintergrundprozesses mitteilen (alternativ hier mit Datenbank arbeiten).

Nun läuft also der FTP-Transfer und es besteht keine Verbindung mehr zwischen Client und Server. Per Poll-Abfrage prüfst du dann ständig, wie groß die Datei schon ist (und zeigst dann nach Bedarf den Fortschrittsbalken an) und prüfst ebenso, ob der Hintergrundprozess noch am Laufen ist. Dazu einfach in der Prozessliste gucken (ps -A), die PID liegt dir beim Clienten oder in der Datenbank vor, je nachdem, wie du es implementiert hast. Ist der Hintergrundprozess dann beendet, so ist der FTP-Transfer auch zu Ende - du kannst dem Clienten sagen: Yuchuu, wir sind fertig! :)

Die PCNTL Erweiterung für PHP ist allerdings keine Standard-Erweiterung, aber so wie du dich angehört hast, läuft das eh auf einem eigenen Server. Codebeispiele für das forken eines Prozesses mit PHP erhältst du, wenn du im Forumsarchiv 2006 nach "dennis jabber" suchst ;-)

Viele Grüße aus Kanada,
  ~ Dennis.