PHP-Dateidownload blockiert die Website

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP-Dateidownload blockiert die Website

    Hiho,

    ich hab mir einen PHP-Download geschrieben, mit dem ich Dateien ausserhalb des Document-Roots herunterladen kann. Blöderweise ist die Website solange blockiert bis der Download abgeschlossen wird.

    Hier ein bissel Code:

    Link für den Download:

    PHP-Code:
    echo "<a href=\"./download.php?id=1"\">Link</a>; 
    Auszug aus download.php welcher meines Erachtens das Problem verursacht:

    PHP-Code:
    $handle fopen($filename'rb');
           if (
    $handle === false) {
               return 
    false;
           }
           while (!
    feof($handle)) {
               
    $buffer fread($handle$chunksize);
               echo 
    $buffer;
               
    ob_flush();
               
    flush();
               if (
    $retbytes) {
                   
    $cnt += strlen($buffer);
               }
           } 
    Sprich solange der Server das PHP-Skript abarbeitet antwortet er natürlich nicht, gibt es eine Möglichkeit den Download unabhängig von der Website anzuschmeissen?

    Gruß sneakizzel

  • #2
    Ich verstehe nicht recht. Der Server beantwortet keine weiteren Anfragen?
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Jup, den Prozess forken.

      Kommentar


      • #4
        @unset: Jupp, also du klickst einen Link an und die verlinkte Seite wird erst angezeigt wenn der Download abgeschlossen ist.

        @Skaschy: Yeah , genau quasi den Download als Kindprozess laufen lassen, ist das überhaupt möglich über PHP? Mhhh, werd' mal schaun ob google was ausspuckt

        Gruß sneakizzel

        Kommentar


        • #5
          Und wenn du den Download in einem Extrafenster startest? Ich kann mir nämlich nicht vorstellen, dass der komplette Server ausgelastet ist. Viel eher lädt der Browser das File in dem aktuellen Fenster, so dass du nicht weiter navigieren kannst!

          Kommentar


          • #6
            Also der Server ist natürlich nicht komplett ausgelastet, die anderen Domains die er verwaltet gehen natürlich.

            Den Link im Extra-Fenster starten geht leider auch nicht

            Kommentar


            • #7
              Jupp, also du klickst einen Link an und die verlinkte Seite wird erst angezeigt wenn der Download abgeschlossen ist
              Nochmal zum Verständnis: Der User klickt einen Link, der zu einem Download führt. Und wenn dieser abgeschlossen ist soll eine HTML Seite angezeigt werden?? Ich verstehe nicht ganz wie das gehen sollte, denn für den Download hast du dem Client bereits entsprechende Header geschickt, damit er weiss was er sich da runterlädt. Zur Anzeige einer Seite müsstest du nochmals Header absetzen um dem Browser anzuzeigen, dass nun eine HTML Seite kommt. Da aber bereits Header für den DL gesendet wurden, geht das nicht (manuelles Senden der Header würde zu einer Fehlermeldung seitens des PHP Parsers führen). Eine Weiterleitung mittels header() ist auch nicht mehr drin.
              Einzige Option wäre für mich den DL in einem eigenen Fenster zu starten.

              Gruss

              tobi
              Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

              [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
              Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

              Kommentar


              • #8
                Also der User klick den Link für den Download an und der Download fängt an. Während des Downloads kann der User nun die Wartezeit nicht damit verkürzen sich die restliche Homepage anzuschauen, da diese sich erst nach Abschluß des Download navigieren lässt.

                Extrafenster hab ich versucht indem ich den Download in einem neuen Tab (Firefox) gestartet habe und auch in dem ich den Link wie folgt angepasst habe:


                PHP-Code:
                echo "<a href=\"./download.php?id=1\" target=\"_blank\">Link</a>; 
                Anstatt das fread() (siehe oben) benutze ich jetzt readline()
                etwa so:

                PHP-Code:
                $file "Pfad+Filename";

                header("Content-Type: x-type/subtype");
                header("Content-Length: ".filesize($file));
                header("Content-Disposition: attachment; filename=Filename");
                        
                readfile($file); 
                In einem anderem Forum hat jemand ein ähnlich gelagertes Problem, worauf ein anderer User auf folgendes hingewiesen hat:

                A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy.
                Soll in der RFC 2016, 8.1.4 Practical Considerations: stehen, werd' ich mir gleich mal reinziehen.

                Der Lösungstipp war den Hoster nach der Server-Konfiguration zu fragen

                Gruß sneakizzel

                Kommentar


                • #9
                  macht schon sinn, um download-services zu unterbinden. Aber zumindest 1 download + webseite sollte dann natürlich noch laufen.

                  Kommentar


                  • #10
                    Joa, sehe ich auch so: Download + Website = 2, ergo nicht mehr als zwei

                    Kommentar


                    • #11
                      Original geschrieben von sneakizzel
                      Also der Server ist natürlich nicht komplett ausgelastet, die anderen Domains die er verwaltet gehen natürlich.

                      Den Link im Extra-Fenster starten geht leider auch nicht
                      <glaskugel>
                      Falsche Diagnose!!
                      Weil: Es funktionieren nicht nur die anderen Domains, sonden mit einem zweiten Browser geht es auch. Es wird nur der jeweilige Browser blockiert, welcher den Download gestartet hat.

                      Teste es:
                      Starte den Download gleichzeitig mit dem FF, IE und Opera. Du wirst sehen, dass mit jedem Browser eine Instanz arbeitet, du aber keine zweite zur Funktion bewegen kannst.

                      Warum?
                      Eindeutig: Du verwendest Sessions und bist in die "Frames Falle" getappt!
                      Siehe: http://de.php.net/manual/de/function...rite-close.php
                      </glaskugel>
                      Zuletzt geändert von combie; 08.11.2007, 15:02.
                      Wir werden alle sterben

                      Kommentar


                      • #12
                        Jau, dat wars

                        Das mit dem zweiten Browser hab ich auch schon festgestellt, hat mich aber erstmal nicht weitergebracht. Jetzt funzt so wie gewünscht.

                        Vielen Dank sneakizzel

                        PS: Ich mag deien <GLASKUGEL> ^^

                        Kommentar

                        Lädt...
                        X