Il modo più semplice per acquisire dimensioni di file remoti in PHP?
Domanda
Stavo pensando di fare una richiesta principale con CURL, mi chiedevo se questa è la strada da percorrere?
Soluzione
Sì. Poiché il file è remoto, sei completamente dipendente dal valore dell'intestazione Content-Length
(a meno che non desideri scaricare l'intero file). Ti consigliamo di curl_setopt ($ ch, CURLOPT_NOBODY, true)
e curl_setopt ($ ch, CURLOPT_HEADER, true)
.
Altri suggerimenti
La migliore soluzione che segue il principio KISS
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE));
$filesize = $head['content-length'];
Immagino che usare curl per inviare una richiesta HEAD sia una buona possibilità; qualcosa del genere probabilmente farebbe:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
var_dump($size);
E ti porterà:
float 3438
In questo modo, stai usando una richiesta HEAD e non stai scaricando l'intero file; tuttavia, dipendi dal server remoto che invia un'intestazione corretta della lunghezza del contenuto.
Un'altra opzione a cui potresti pensare sarebbe quella di utilizzare filesize
... Ma questo fallirà : la documentazione indica (citazione) :
A partire da PHP 5.0.0, questa funzione può può essere utilizzato anche con alcuni wrapper di URL. Fare riferimento a Elenco dei supportati Protocolli / wrapper per un elenco di cui wrapper supportano stat () famiglia di funzionalità.
E, sfortunatamente, con wrapper HTTP e HTTPS , stat ()
non è supportato ...
Se ci provi, otterrai un errore, come questo:
Warning: filesize() [function.filesize]: stat failed
for http://sstatic.net/so/img/logo.png
Peccato :-(
L'uso di una richiesta HEAD e il controllo di Content-Length
è il modo standard per farlo, ma non puoi fare affidamento su di esso in generale, poiché il server potrebbe non supportarlo. L'intestazione Content-Length
è facoltativa e inoltre il server potrebbe non implementare nemmeno il metodo HEAD. Se sai quale server stai sondando, puoi verificare se funziona, ma come soluzione generale non è a prova di proiettile.
Se non hai bisogno di una soluzione antiproiettile puoi semplicemente fare:
strlen(file_get_contents($url));