È lento perché file_get_contents()
legge l'intero file in $page
, PHP attende il file da ricevere prima di emettere il contenuto. Quindi quello che stai facendo è: scaricare l'intero file sul lato server, quindi emetterlo come una singola stringa enorme.
file_get_contents()
non supporta lo streaming o l'acquisizione di offset del file remoto. Un'opzione è di creare un socket raw con fsockopen()
, fare la richiesta HTTP e leggere la risposta in un ciclo, mentre leggi ogni chunk, inviarlo al browser. Questo sarà più veloce perché il file verrà trasmesso in streaming.
Esempio dal manuale:
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
header('Content-Type: audio/mpeg');
$out = "GET/HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
che questo è un loop mentre c'è ancora disponibili contenuti, ad ogni iterazione legge 128 byte e quindi lo emette al browser. Lo stesso principio funzionerà per quello che stai facendo. Dovrai assicurarti di non generare le intestazioni HTTP di risposta che saranno le prime poche righe, perché poiché stai facendo una richiesta non elaborata, otterrai la risposta non elaborata con le intestazioni incluse. Se si generano le intestazioni di risposta si finisce con un file corrotto.
$ url è un percorso locale o un URL http: //? – Intrepidd
@Intrepidd Sì, mi dispiace, un URL remoto. – think123
Qual è la dimensione del file e molti secondi necessari per il recupero? Dividi uno per l'altro e troverai la larghezza di banda. Se è inaspettatamente lento, tu o il lato remoto avete bisogno di più! –