Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP-Download

Einklappen

Neue Werbung 2019

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

  • PHP-Download

    Guten Abend,

    ich habe eine kleine PHP Datei download.php geschrieben, diese liest anhand übergebener Daten den Downloadlink aus, sowie den Dateinamen. Ich definiere alle notwendigen PHP-Header für den Download wie Dateigröße, alle anderen stehen auch in meinem Codeausschnitt den ich hier auch poste.

    Problem ist das es um Dateien mit der Größe von ca. 200-400MB geht. Jetzt wollte ich wissen welche einstellung in der Konfiguration von PHP daran schuld sein könnte, das ganze läuft auf einem Root Server daher lässt sich alles anpassen. Oder ob etwas bei den Headerinfos fehlt was ich mir nicht vorstellen kann, Dateiname und Downloadlink die von den Variablen übergeben werden sind alle 100% richtig und habe ich extra überpüft. Leider bricht der Download egal bei welcher Datei bei langsamen Internetleitungen nach ca. 110MB ab, bei schnellen Downloadleitungen gibt es keine probleme.

    PHP-Code:
                            set_time_limit(0);
                      
    ini_set('memory_limit''-1');
                
    ini_set('max_execution_time'10000);
                while(
    $row mysql_fetch_array($dl)) {
                    
    $verzeichnis "";
                    
    $dateiname $row['dl'];
                }
                
    $dateinamegen "[anwendung]".$dateiname;
                
    $filegröße filesize($pfad.$dateiname);
                
    ob_end_clean();
                    
    header('Content-Type: application/octet-stream');
                
    header('Content-Disposition: attachment; filename="'.$dateinamegen.'"');
                
    header('Content-Transfer-Encoding: binary');
                
    header('Expires: 0');
                
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
                
    header('Connection: Keep-Alive');
                
    header('Content-Length: ' $filegröße);
                
    readfile($domain.$dateiname); 


  • #2
    Die original mysql-Erweiterung ist veraltet (mysql_*-Funktionen) und wird in den kommenden Versionen aus PHP entfernt. Aktuell wirft sie schon E_DEPRECATED-Fehler bei einer Verbindung zur Datenbank. Des Weiteren stehen dir sehr viele tolle Features von mysql mit diesen Funktionen nicht zur Verfügung! Weiterführende Links:
    Choosing an API
    Warum man mysql* generell nicht (mehr) nutzen sollte.
    Wie man von mysql* auf PDO umsteigt
    Wissenswertes zum Thema SQL-Injection
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Ok, danke für die Links, leider hilft es mir bei meinem problem nicht weiter.

      Kommentar


      • #4
        Ist der Abbruch an eine Zeit gekoppelt, hast du das mal gemessen?

        LoadBalancer / ReverseProxy im Einsatz?
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Ich habe es gerade nochmal getestet und der Download hat nach 07min 20sek gestoppt, er bricht den dann einfach ab und speichert die Datei normal ab als wäre sie vollständig, eine Fehlermeldung oder einen Abbruch des Downloads zeigt der Downloadclient des Firefox auch nicht an. Das der Download Client aber die richtige Datengröße im PHP-Header bekommt habe ich schon überprüft. Er zeigt auch die noch verbleibende Zeit des Downloads an.

          Kommentar


          • #6
            Webserver und PHP Logs schon überprüft?
            Ggfs. Einstellungen des Webservers bezüglich Lebensdauer von Verbindungen checken.
            Andere Browser ausprobiert?

            Klingt so'n bisl nach Timeout, der kann aber von vielen Seiten her kommen (daher nochmal die Frage nach dem Proxy - sitzt da noch jemand zwischen?).
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              ich habe bei readfile immer die "Befürchtung", dass die Datei 1 mal unnötig in den PHP-Speicher geladen wird - und bei der "Ausgabe" Richtung Client dann nochmal soviel an Puffer-Speicher belegt.

              Ich würde dir daher bei größeren Dateien empfehlen, die Datei in "kleinen Häppchen" mittels Schleife zum Client zu befördern

              PHP-Code:
                      // $Datei=Dateiname + Pfad aus Datenbank
                      
              if (file_exists($Datei)) {
                          
              $Dateiname basename($Datei);
                          
              $Groesse filesize($Datei);
                          
              $file=fopen($Datei,'r');
                          
              set_time_limit(0);
                          if (
              $file) {
                              
              header("Pragma: public");
                              
              header("Expires: 0");
                              
              header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                              
              header("Cache-Control: private",false);
                              
              header("Content-Type: application/pdf");
                              
              header("Content-Disposition: attachment; filename=\"".$Dateiname."\";");
                              
              header("Content-Description: File Transfer");
                              
              header("Content-Transfer-Encoding: binary");
                              
              header("Content-Length: ".$Groesse );
                              
              flush();
                              while (!
              feof($file)) {
                                  print(
              fread($file,4096));
                                  
              flush();
                              }
                          }
                          
              fclose($file);
                          die();
                      } 
              so mach ich das zum Bleistift; funktioniert selbst für Gigabyte große Files, wenn der PHP-Speicher auf die "üblichen" 128 MB begrenzt ist

              den File-Typ kann man ja auch über die Datenbank bestimmen, in meinem Fall eben ein PDF
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

              Kommentar


              • #8
                Danke werde ich heute noch testen.

                @lstegelitz: Nein es werden keinerlei Proxys genutzt an keiner stelle von Server und vom Client.

                Kommentar

                Lädt...
                X