2010-06-01 17 views
5

Durante l'installazione di un sistema di gestione file online, ora ho colpito un blocco.PHP readfile() e download di grandi dimensioni

sto cercando di spingere il file al client utilizzando questo modified version of readfile:

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; 
} 

Ma quando provo a scaricare un file di 13 MB, è solo la rottura a 4 MB. Quale sarebbe il problema qui? Non è sicuramente il limite di tempo di qualsiasi tipo, perché sto lavorando su una rete locale e la velocità non è un problema.

Il limite di memoria in PHP è impostato su 300 MB.

Grazie per qualsiasi aiuto.

+2

C'è quasi sicuramente qualcosa nel registro degli errori, presupponendo che sia stato attivato. Controlla quello e modifica la domanda. – timdev

+0

No. Niente in merito a questo nel registro degli errori. Tutto quello che ho sono alcuni avvisi di deprecazione da diversi script. – Nirmal

+0

Quale client stai usando per scaricare il contenuto? Il comportamento cambia se si utilizza un client diverso? Il mio Guess sarebbe che l'agente che stai usando non può gestire una codifica chunked di grandi dimensioni. Prova un altro cliente/e/o annusando il traffico. – symcbean

risposta

4

Molto probabilmente si sta colpendo il limite del buffer di risposta impostato dal proprio server web. È noto che IIS e FastCGI hanno 4mb come dimensione predefinita del buffer. Vorrei iniziare la ricerca guardando nel server web < -> Configurazione SAPI PHP.

+0

C'è qualche altro svantaggio nell'aumentare il limite del buffer? L'impostazione, ad esempio, di 50 MB crea un problema per l'esperienza generale di navigazione? Grazie per qualsiasi intuizione. – Nirmal

+0

Nessuno, oltre al potenziale ingombro di memoria del server web, e la memoria è a buon mercato ora. – m1tk4

+0

'Nota:' Vorrei avere più risposte per la domanda, ma poiché la munizione stava per finire, dovevo darla a questa risposta. – Nirmal

1

NON svuotare l'output, ma provare a bufferizzarlo e quindi inviarlo al client in un unico pezzo.

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

// do read/echo operations 

ob_end_flush(); 
+0

Perché dovrebbe farlo? L'intero punto di utilizzo della funzione readline() di sostituzione è di evitare di leggere l'intero file nello spazio di memoria di PHP contemporaneamente. La tua risposta sconfigge completamente questo scopo. – timdev

+0

@timdev - Intendevi la funzione 'readfile()'? Si hai ragione. L'invio del file come un intero pezzo è ciò che vogliamo evitare qui. – Nirmal

+0

@Nirmal, ehm, sì, duh. – timdev

Problemi correlati