Ankündigung

Einklappen
Keine Ankündigung bisher.

Download per php meldet filesize(): stat failed und bricht ab

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

    Download per php meldet filesize(): stat failed und bricht ab

    Hallo,

    mit folgendem Script biete ich Dateien zum Download an:

    PHP-Code:
    header("Content-Type: application/zip");
                            
    header('Content-disposition: attachment; filename="' $file '"');
                            
    $size filesize($file );
                            
    header("Content-length: $size");
                            
    readfile($file ); 
    Es funktioniert wunderbar, außer die Datei ist größer als 2 GB.
    Dann bekomme ich folgende Meldung (data.zip hat 2.3GB):

    filesize(): stat failed for ...data.zip
    readfile(...data.zip): failed to open stream: Value too large for defined data type in ...download.php

    Ich habe bereits mit dem Support telefoniert und er meinte das liegt an der php.ini. Diese habe ich also angepasst:

    upload_max_filesize=4096M
    post_max_size=4096M

    Das hilft aber nichts. Und war eigentlich klar, da das Standard-Limit ja bei 8MB liegt und Dateien mit 1.5 GB noch tadellos funktionieren.

    Irgendwelche Ideen?
    Danke!

    #2
    upload_max_filesize und post_max_size haben nur etwas mit dem Upload von Dateien zu tun.

    readfile() lädt die Datei in den RAM. Da wirst du wohl ans memory limit stoßen.
    Also entweder die Datei sequentiell auslesen und dem User ausliefern oder (besser) was mit Symlinks, htaccess und automatisierter Löschung bauen. Bei letzterer Lösung stößt du auch garantiert nicht mehr an irgendwelche PHP-Limits.

    Eine andere Alternative wäre mod_xsendfile, aber das ist bei df afaik nicht installiert.

    Kommentar


      #3
      Vielen Dank für die schnelle Antwort! Was meinst du denn mit sequentiell auslesen?

      Kommentar


        #4
        Naja, readfile() liest die komplette Datei ein. Du kannst die Datei aber auch Stückweise (fopen(), fgets(), ...) auslesen und zurückgeben. Damit umgehst du zumindest das Problem der RAM-Beschränkung.

        Kommentar


          #5
          Bei fopen bekomme ich dieselbe Fehlermeldung wie bei readfile:
          fopen(...data.zip): failed to open stream: Value too large for defined data type

          Kommentar


            #6
            Ich habe auch nochmal mit dem Support telefoniert und nun meinten sie, das sei eine Einschränkung durch php (Version 7). Es geht sonst nur über ftp oder ssh. Und das wäre bei jedem anderen Anbieter genauso.

            Kommentar


              #7
              Lässt sich denn die Datei als Direktlink herunterladen?

              Wenn ja könntest du die Datei einfach mit "mod_rewrite" zum Download anbieten.
              Du erzeugst mit PHP einen Downloadlink http://www.domain.tld/download/41394...gkhg/datei.zip

              Mit "mod_rewrite" kannst du die Zugriffe auf den Ordner "download" auf die eigentliche Datei umlenken.

              Das hat auch den Vorteil, dass die Datei direkt von dem Apachen ausgeliefert wird und php gar nicht mehr involviert ist.
              MfG,
              masterframe

              Kommentar


                #8
                Ich habe nochmal etwas gegoogelt und diese php Beschränkung auf 2GB gibt es wohl nur auf 32 bit (Domainfactory gibt mir bei PHP_INT_SIZE 4 aus). Habe dann mal einen anderen Hoster (united domains) probiert (PHP_INT_SIZE ist hier 8, also 64 bit) und da funktioniert es einwandfrei.
                Der Support von df ist nicht grad das gelbe vom Ei...

                Kommentar


                  #9
                  dF hat auch 64bit Tarife.
                  Wechsel geht direkt über das Kundenmenu.
                  MfG,
                  masterframe

                  Kommentar


                    #10
                    Ich habe tatsächlich vor einiger Zeit auch ein Script geschriebene welches X-Sendfile über Symlinks "emuliert".
                    Evtl. hilft dir das auch.
                    https://github.com/muellerlukas/simulatesendfile

                    Kommentar


                      #11
                      Danke euch! Ich werde zum 64bit Tarif wechseln...

                      Kommentar


                        #12
                        Zitat von steoberg Beitrag anzeigen
                        Danke euch! Ich werde zum 64bit Tarif wechseln...
                        Super, bitte machen Sie das.

                        Wir bitten darüber hinaus darum, bei solch technischen Fragen unsere Technik über das Kundenmenü anzuschreiben. Unsere Kollegen im telefonischen Support sind natürlich auch breit versiert, aber keine Entwickler/Administratoren, die auf solche tiefgreifende Fragen direkt antworten können.

                        Alternativ natürlich gerne hier im Forum posten.

                        Mit freundlichen Grüßen

                        Nils Dornblut
                        Blog - Facebook - Twitter
                        Communitybetreiber: domainfactory GmbH
                        Impressum / Pflichtangaben

                        Kommentar


                          #13
                          Danke, das werde ich künftig machen.
                          Möchte aber darauf hinweisen, dass mir am Telefon eine Aussage wie "bitte wenden Sie sich an den Technik Support..." mehr helfen würde, als "passen Sie die php.ini an". Was mich am Ende nur Zeit kostet.

                          Kommentar


                            #14
                            Zitat von steoberg Beitrag anzeigen
                            Danke, das werde ich künftig machen.
                            Möchte aber darauf hinweisen, dass mir am Telefon eine Aussage wie "bitte wenden Sie sich an den Technik Support..." mehr helfen würde, als "passen Sie die php.ini an". Was mich am Ende nur Zeit kostet.
                            Danke für den Hinweis. Natürlich schauen wir, dass wir das tun. Für uns ist es halt auch immer schwierig den jeweiligen Gesprächspartner und dessen Kenntnisstand einzuschätzen. Umgekehrt ist es natürlich auch voll verständlich. Mir geht das persönlich auch oft so bei technischen Gesprächen, die ich mit Hotlines oder per E-Mail führe. Man will da ja auch nicht direkt sagen, dass man Informatiker ist und in der Materie tief drin steckt. Bitte da gerne die Kollegen unterstützen und jeweils versuchen da die Basis zu finden. Sie werden es dann sicher danken und auch entsprechend verweisen, wenn sie selbst es nicht technisch tiefer wissen.

                            Mit freundlichen Grüßen

                            Nils Dornblut
                            Blog - Facebook - Twitter
                            Communitybetreiber: domainfactory GmbH
                            Impressum / Pflichtangaben

                            Kommentar

                            Lädt...
                            X