2010-06-01 16 views
5

Während der Einrichtung eines Online-Datei-Management-System und jetzt habe ich einen Block getroffen.PHP readfile() und große Downloads

Ich versuche, die Datei an den Client mit dieser modified version of readfile zu drücken:

function readfile_chunked($filename,$retbytes=true) { 
    $chunksize = 1*(1024*1024); // how many bytes per chunk 
    $buffer = ''; 
    $cnt =0; 
    // $handle = fopen($filename, 'rb'); 
    $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); 
     } 
    } 
     $status = fclose($handle); 
    if ($retbytes && $status) { 
     return $cnt; // return num. bytes delivered like readfile() does. 
    } 
    return $status; 
} 

Aber wenn ich versuche, eine 13 MB-Datei zum Download, es ist nur bei 4 MB zu brechen. Was wäre das Problem hier? Es ist definitiv nicht das Zeitlimit irgendeiner Art, weil ich in einem lokalen Netzwerk arbeite und Geschwindigkeit kein Problem ist.

Das Speicherlimit in PHP ist auf 300 MB festgelegt.

Vielen Dank für jede Hilfe.

+2

Es ist fast sicher etwas im Fehlerprotokoll, vorausgesetzt, Sie haben es eingeschaltet. Überprüfen Sie das und ändern Sie die Frage. – timdev

+0

Nein. Nichts im Zusammenhang damit im Fehlerprotokoll. Alles, was ich habe, sind einige Verwarnungen aus verschiedenen Skripten. – Nirmal

+0

Welchen Client benutzen Sie, um den Inhalt herunterzuladen? Ändert sich das Verhalten, wenn Sie einen anderen Client verwenden? Mein Vermutung wäre, dass der Agent, den Sie verwenden, große chunked Codierung nicht bewältigen kann. Versuchen Sie einen anderen Client/und/oder schnüffeln Sie den Verkehr. – symcbean

Antwort

4

Höchstwahrscheinlich treffen Sie die von Ihrem Webserver festgelegte Antwortpuffergrenze. Es ist bekannt, dass IIS und FastCGI 4 MB als Standardpuffergröße haben. Ich würde Ihre Suche mit Blick auf den Webserver starten < -> PHP SAPI-Konfiguration.

+0

Gibt es einen weiteren Nachteil bei der Erhöhung der Puffergrenze? Stellt das Setzen auf beispielsweise 50 MB ein Problem für die allgemeine Browser-Erfahrung dar? Danke für jede Einsicht. – Nirmal

+0

Keine, außer dem potenziellen Speicherbedarf des Webservers und Speicher ist jetzt billig. – m1tk4

+0

'Anmerkung:' Ich wünschte, ich hätte mehr Antworten auf die Frage, aber da die Kopfgeldausgabe kurz vor dem Ende stand, musste ich diese Antwort geben. – Nirmal

1

spülen Sie NICHT Ihre Ausgabe, aber versuchen Sie es zu puffern und senden Sie es dann an den Client in einem Stück.

ob_clean(); // in case anything else was buffered 
ob_start(); 

// do read/echo operations 

ob_end_flush(); 
+0

Warum sollte er das tun? Der Sinn der Ersetzung der readline() - Funktion liegt darin, das Lesen der gesamten Datei in den Speicherbereich von PHP zu vermeiden. Deine Antwort vereitelt diesen Zweck vollständig. – timdev

+0

@timdev - Meinten Sie 'readfile()' Funktion? Ja, du hast recht. Das Senden der Datei als ein ganzes Stück ist das, was wir hier vermeiden wollen. – Nirmal

+0

@Nirmal, äh, ja, duh. – timdev