2012-06-13 3 views
6

Ich habe alle Header versucht. Mit und ohne Inhaltslänge.900 MB http Zwangs Downloads selten fertig

Das Problem ist, dass der Download etwa zur Hälfte kaputt geht. Aber nur die meiste Zeit.

Manchmal funktioniert es gut.

Serverressourcenverwendung ist trivial. Alle Konfigurationsdateien sind in Ordnung. Ich laufe nicht PHP-Skript, während es geht.

Hat jemand das schon mal gesehen? Ist es nicht einmal meine Schuld? Warum manchmal?

$file = "http://domain.com/files/".$item_number.".mov"; 
header('Pragma: no-cache'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Description: File Download'); 
header('Content-Type: application/force-download'); 
//header ('Content-Type: video/quicktime');//doesnt seem to download at all here 
header('Content-Length: '.filesize($file)); 
header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($file); 
exit(); 

Danke, Leider es mein erstes Mal ist.

+4

Wird dieser Download über ein PHP-Skript durchgeführt? Können Sie uns den Code zeigen? –

+3

Hör auf, abschließende Fragen zu beantworten, nur weil sie von einem Neuling gefragt werden. Das ist 100% eine echte Frage. –

+0

Haben Sie sich Ihre Log-Dateien angesehen? PS - Code bitte. – xbonez

Antwort

3

Dies kann mehrere Gründe haben.

Sie sagen, dass Server-Ressourcen in Ordnung sind, aber ich denke, PHPs readfile() lädt die gesamte Datei in den Speicher vor dem Senden. Zum Glück gibt es eine gute solution in der Dokumentation, die Sie auf jeden Fall verwenden sollten, um Probleme mit mehreren Downloads zu vermeiden :)

Haben Sie auch Ihre Script-Ausführungszeit auf unendlich eingestellt?

Als nächstes wären Ihre Servereinstellungen. Vielleicht schließen sie die Verbindung wegen eines Timeout-/Resource-Hog-Grundes.

Verwenden Sie zum Beispiel das Google Chrome-Entwicklerwerkzeug, um die gesendeten Header genau zu untersuchen. PHP setzt einige Header selbstständig. Sie sollten session_cache_limiter(false); am Anfang Ihres Skripts setzen. Wenn ich mich richtig erinnere, sogar Expires: Thu, 19 Nov 1981 08:52:00 GMT ... Warum ist das schlecht? Als nächstes kommen;)

Sie können die Etag und Last-Modified-Header senden. Ich fasse zusammen, dass es eine eindeutige Kennung für Ihre Ressource ist, die es ermöglicht, Downloads fortzusetzen. Ich denke, gute Artikel darüber zu lesen ist besser als nur ein paar Sätze hier zu geben. In Ihrem Fall könnten Sie PHPs Funktion verwenden, um ein Etag zu erstellen.

Es gibt einige Leute mit Kopf- und Downloads zu kämpfen, könnten Sie (oder beheben Ihrem Fall) here

Zusammenfassung starten:

  • Überprüfen Sie Ihre PHP/Server-Ablauf/Einschränkungen/Ressourceneinstellungen
  • Achten Sie darauf, die Datei gepuffert zu senden
  • Ermöglichen, Downloads fortzusetzen
  • Überprüfen Sie die Header, die Sie senden

Danach sollten Sie in Ordnung sein. Mit dem Fortsetzen auch wenn es noch kaputt gehen sollte ...

Gute Fortschritte und Erfolge!

+1

Aus dem Handbuch "readfile() wird keine Speicherprobleme auftreten, selbst wenn große Dateien gesendet werden. Wenn ein Speichermangel auftritt, vergewissern Sie sich, dass die Ausgangspufferung mit ob_get_level() deaktiviert ist." – Matthew

+0

Vielleicht Shared Host oder etwas anderes - Ich habe nur alles zusammengefasst, was ich weiß, dass könnte der Grund sein :) readfile() wird kein Speicherproblem angezeigt werden * IF * ... Es ist definitiv einer der Liste. –

+0

http://stackoverflow.com/questions/6627952/why-does-readfile-exubert-php-memory Server Mist, mehrere Benutzer, im Wesentlichen, was ich gesagt habe - und die Hauptsache ist immer noch Ressource Schweine wie diese zu beseitigen –