readfile / readfile_chunked Problem

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

  • readfile / readfile_chunked Problem

    Hallo Leute!

    Ich habe ein kurioses Problem.
    Ich leite Dateien via readfile bzw. readfile_chunked an den Benutzer weiter.
    Das funktioniert auch an sich einwandfrei und auch rattenschnell, aber ab ca. genau 20 MB klappt das nicht mehr, und der Internet Explorer bricht nach ein paar Sekunden ab.

    Ich erhalte keinerlei Fehlermeldungen, der Browser hört einfach auf und quittiert mit einer Internet Explorer Eigenen Fehlerseite.
    Auch in den beteiligten Log-Dateien steht keinerlei Fehler, Warnung oder Hinweis.

    Meine Maximum Execution und Input Time liegen jeweils bei 480 Sekunden.
    Mein Memory Limit bei 512 MB.
    Des weiteren tritt das Problem nicht nur bei readfile, sondern auch bei readfile_chunked auf, dort ändert sich nichts.
    Als Webserver benutze ich einen Apache 2.

    Mir gehen aktuell die Ideen aus, zumal alles was ich im Netz finden konnte, wahlweise mit readfile_chunked funktioniert hat, oder das Problem offen stehen geblieben ist.

    Hat vielleicht wer eine Idee?


    Danke im Voraus

    Patrick

  • #2
    Sendest du Header, die nicht zum Payload passen, z.B. Content-Length <=20MB und dann >20MB Daten?
    Zeig mal den Code!

    Kommentar


    • #3
      Hast du schonmal ein Tool zum mitlesen der http-header benutzt? Evtl. findet sich da ein Hinweis.

      Was ist readfile_chunked? Kann die Funktion im PHP-Manual nicht finden - auch kein Hinweis auf eine ähnlich benamte Funktion im Manual unter PHP: readfile - Manual

      EDIT:
      Ok - wahrscheinlich das aus den User Contributed Notes.

      Tippe wie onemorenerd auch auf ein Problem mit den Headern.
      Zuletzt geändert von Quetschi; 02.03.2011, 11:30.
      Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
      Schön - etwas Geschichte kann ja nicht schaden.
      Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

      Kommentar


      • #4
        Also das hier ist der entsprechende Quellcode was den Download betrifft.

        PHP-Code:
                // download the file
                
        header('Content-Type: application/octet-stream');
                
        header('Content-Disposition: attachment; filename=abc.zip');
                
        header('Content-Length: ' $size);
                
        readfile_chunked($target); 
        Ich habe wie gesagt schon readfile, sowie readfile_chunked probiert. Beides das gleiche Ergebnis.

        Auch habe ich die Länge komplett weggelassen, kein Erfolg.
        Bei der 20 MB Datei beträgt die Länge z.B. ~21.000.000 Bytes, ist also korrekt.

        Als Content-Type habe ich auch zusätzlich schon force-download probiert, ebenfalls kein Erfolg.

        Das seltsame ist für mich, dass der Browser bereits nach max. 2, 3 Sekunden weiß, dass er nix zu tun hat und mit "Die Webseite kann nicht angezeigt werden." antwortet...

        Kommentar


        • #5
          Verwendest du HTTPS?

          Woher kommt $size?

          Kommentar


          • #6
            Ich wiederhole mich - Header beobachten - da dürfte der Hund begraben liegen.
            Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
            Schön - etwas Geschichte kann ja nicht schaden.
            Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

            Kommentar


            • #7
              Ja, ich verwende HTTPS.
              Spielt das dabei eine Rolle?

              $size kommt hier her
              PHP-Code:
              $size filesize($target); 
              $target ist der Pfad zur Datei.

              Kommentar


              • #8
                Zitat von Errraddicator Beitrag anzeigen
                Ja, ich verwende HTTPS.
                Spielt das dabei eine Rolle?
                Ja, eine sehr große. Der IE führt sich auf wie eine Diva, wenn es um HTTPS geht. Der braucht immer ganz spezielle Header. Google hilft weiter.

                Kommentar


                • #9
                  Die Funktion readfile_chunked aus den User Comments auf PHP: readfile - Manual gibt, so wie du sie aufrufst, ein Array zurück. Würdest du das wie einen String ausgeben, wäre das Ergebnis nur "Array". Doch du gibst es gar nicht aus! Anders als readfile() schreibt readfile_chunked() nämlich nicht direkt in den Ausgabepuffer.

                  Übrigens ist diese Funktion ziemlicher Mist. Wenn man als zweiten Parameter "string" übergibt, erhält man nur die letzte Zeile. Wenn man irgendwas außer "array" und "string" übergibt, erhält man eine Warnung und NULL. $buffer wird überhaupt nicht verwendet.
                  Merke: Nicht alles in den UC ist gut!

                  Machs doch erstmal mit readfile(). Wenn das funktioniert, kannst du ja versuchen, chunked transfer umzusetzen - falls du es überhaupt brauchst.

                  Edit: Jetzt sehe ich erst, dass es weiter unten in den UC eine weitere Version von readfile_chunked gibt, die auf den ersten Blick besser aussieht. Auch nicht das Gelbe vom Ei, aber sollte wenigstens funktionieren.
                  Zuletzt geändert von onemorenerd; 02.03.2011, 12:22.

                  Kommentar


                  • #10
                    Hab mich auch grad kirre gemacht was die Funktion überhaupt bringen soll

                    Bin auch der Meinung, dass erstmal readfile benutzt werden sollte um das zum laufen zu bringen - chunked-Transfer kann man sich dann im Anschluss ansehen. Und das hat ja auch nicht damit zu tun, ob man die Datei nur häppchenweise in PHP ausliest. Es muss dann ja vor jedem Chunk noch die Information in der Ausgabe bereitgestellt werden, wie lang das jeweilige Stückchen ist.
                    Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
                    Schön - etwas Geschichte kann ja nicht schaden.
                    Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

                    Kommentar


                    • #11
                      Ne ne, also die readfile_chunked funktion funzt schon einwandfrei, aber eben (genauso wie readfile!) nur bis zu der Grenze von ca. 20 MB.

                      Des Weiteren habe ich die Funktion etwas gekürzt (was Ihr nich wissen konntet, aber eigentlich auch nix zur Sache tut, da ich ja geschrieben habe, dass sie per se einwandfrei funktioniert *G*)

                      PHP-Code:
                        function readfile_chunked($filename)
                        { 
                          
                      $chunksize 256 1024// how many bytes per chunk 
                          
                          
                      $handle fopen($filename'rb'); 
                          if(
                      $handle !== false)
                          {
                            while(!
                      feof($handle) )
                            { 
                              
                      $buffer fread($handle$chunksize); 
                              echo 
                      $buffer
                              
                      ob_flush(); 
                              
                      flush();
                            }
                            
                            
                      fclose($handle);
                          }
                        } 
                      Aber wie gesagt is das ja eigentlich auch völlig latte, weil ich mit readfile 1:1 das gleiche Verhalten bekomme.

                      Ich vermute mal, das Problem wird hier wirklich der IE in Kombination mit dem HTTPS sein.
                      Muss ich mal schauen, ob ich hierzu einen Anhaltspunkt finde.
                      Zuletzt geändert von Errraddicator; 02.03.2011, 12:48.

                      Kommentar


                      • #12
                        Also ich konnte das Problem noch weiter einschränken.
                        Das Problem tritt NUR bei .zip Dateien auf.

                        Wenn ich z.B. über die gleiche Methodik eine 40 MB PDF-Datei downloaden möchte klappt das einwandfrei. Habe ich (wie in meinem Fall) eine 20 MB .zip-Datei, so kommt die Fehlermeldung / bricht der Internet Explorer ab.

                        Selbst wenn ich die Endung wegnehme kommt dieser Fehler, da er anscheinend nicht nach der Endung geht, sondern den Inhalt auf Dateityp überprüft.

                        Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.

                        Irgendwie bin ich gerade überfragt, wie ich das in den Griff kriegen soll

                        Kommentar


                        • #13
                          Zitat von Errraddicator Beitrag anzeigen
                          Umgehen kann ich das Problem also z.B., wenn ich vor dem Dateiinhalt noch eine "0" z.B. ausgebe. Dann bietet er mir die Datei zwar nicht zum Download an, weil er sie nicht mehr als .zip erkennt, sondern schreibt mir den Inhalt ganz blöd in das Browserfenster, aber immerhin die vollen 20 MB.
                          Dann stimmt was mit den Headern nicht. Hast du dir die Header jetzt eigentlich schon angeschaut?

                          Kommentar


                          • #14
                            Angeschaut schon, aber da stand jetzt für mich nix sinnvolles drin.
                            Wonach soll ich dort denn ausschau halten?

                            Und wenn der Header generell falsch ist, warum funktioniert es dann mit 40 MB PDF Dateien, 20 MB TXT-Daten und 18 MB zip-Daten, aber nicht mit > 20 MB zip Daten?
                            Da will sich mir die Systematik nicht so recht erschließen, wenn ich ehrlich bin.

                            Kommentar


                            • #15
                              Das Problem konnte ich zwar immer noch nicht lokalisieren, aber ich habe zumindest eine Umgehung geschaffen, indem ich die Datei nun verlinke und nicht per readfile ausgebe.

                              Das funktioniert seltsamerweise.
                              Nun muss der Benutzer halt einmal mehr klicken... Nicht ideal, aber besser wie nur Teildaten zu erhalten allemal.

                              Kommentar

                              Lädt...
                              X