2013-02-01 11 views
5

Sto scrivendo uno script che trasmetterà un file da un indirizzo Web attraverso il mio server all'utente. Nel suo stato attuale funziona, ma è molto lento.Lo streaming di un file da Internet tramite PHP è lento

Ecco il codice rilevante:

/* Bytes per second */ 
define('TRANSFER_CAP', 1048576); 

/* Hard part... stream the file to the user */ 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename=' . $filename); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . $filesize); 

$file = fopen($fileLocation, 'rb'); 
if(!$file) { 
    // TODO: handle errors 
} 

while(!feof($file)) { 
    echo fread($file, TRANSFER_CAP/2); 
    ob_flush(); 
    flush(); 

    /* Limit the download speed by sleeping */ 
    usleep(500); 
} 

Questo script è in esecuzione sulla mia macchina locale. Quando richiedo il file nel mio browser (non passando attraverso lo script) ottengo una velocità di download di circa 2,5 MB/s, che è la velocità massima del mio interno. Tuttavia, se eseguo lo script e provo a scaricare lo stesso file, ottengo solo circa 240-250KB/s.

So che non è lo script che limita la velocità di trasferimento, perché ho impostato su 1 MB/s. Inoltre non riesco a pensare a nulla in questo script che produca un sovraccarico che rallenterebbe la velocità.

Edit: Qualcosa di interessante, se faccio questo con readfile() invece ho ottenere quasi tutta la mia velocità di download:

readfile('http://cachefly.cachefly.net/100mb.test'); 

quindi deve essere un problema con l'utilizzo di fopen e fread?

+0

la velocità di caricamento è la stessa del download? in molti posti del mondo non lo sono. Puoi http://speedtest.net testare. –

+0

Non lo è, ma non sto facendo alcun caricamento in questo script. Sto semplicemente scaricando il file, ma per qualche motivo è molto più lento che se scarico il file direttamente attraverso il mio browser. –

+0

scusami frainteso. se non è un file di grandi dimensioni, prova \t file_get_contents() invece –

risposta

0

Perché non basta eseguire un'intestazione HTTP per reindirizzare il file binario stesso? In questo modo prendi il PHP fuori dall'equazione tutti insieme poiché tutto ciò che vuoi fare è servire il file.

+0

Se avessi intenzione di farlo, mi collegherei direttamente al download del file anziché tramite uno script PHP.Ho bisogno di farlo in questo modo per diversi motivi, tra cui il monitoraggio di quanto un utente sta scaricando, in questo modo significa che posso "contare i byte" e ottenere un totale accurato. –

+0

Perché non fare un "include" di qualche tipo da PHP per inviare i dati binari invece di leggere e inviare dati in blocchi? Sto solo pensando ad alta voce. –

0

Fondamentalmente, stai costruendo un server proxy usando PHP. Hai preso in considerazione l'utilizzo di mod_proxy (http://httpd.apache.org/docs/2.2/mod/mod_proxy.html) o Squid Proxy (http://www.squid-cache.org/)

+0

Questa non è un'opzione, anche se sto costruendo ciò che (nella sua forma base) è un proxy, la variabile '$ fileLocation' cambia in base a una chiamata API di terze parti. Quindi l'utilizzo di una mod proxy proxy lato server non funzionerà. –

Problemi correlati