PHP: получить удаленный размер файла с помощью strlen? (HTML)
Я просматривал PHP документы для fsockopen и еще много чего, и они говорят, что вы не можете использовать filesize() для удаленного файла, не делая сумасшедших вещей с помощью ftell или чего-то еще (не уверен, что именно они сказали), но я хорошо подумал о как это сделать:
$file = file_get_contents("http://www.google.com");
$filesize = mb_strlen($file) / 1000; //KBs, mb_* in case file contains unicode
Это будет хороший метод? В то время он казался таким простым и удобным в использовании, просто хотелось подумать, может ли это столкнуться с проблемами или не соответствовать истинному размеру файла.
Я только хочу использовать это на текст (веб-сайты), кстати, не бинарный.
3 ответа
Этот ответ требует PHP5 и cUrl. Сначала проверяются заголовки. Если Content-Length не указан, он использует cUrl для его загрузки и проверки размера (хотя файл нигде не сохраняется - только временно в памяти).
<?php
echo get_remote_size("http://www.google.com/");
function get_remote_size($url) {
$headers = get_headers($url, 1);
if (isset($headers['Content-Length'])) return $headers['Content-Length'];
if (isset($headers['Content-length'])) return $headers['Content-length'];
$c = curl_init();
curl_setopt_array($c, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array('User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'),
));
curl_exec($c);
return curl_getinfo($c, CURLINFO_SIZE_DOWNLOAD);
}
?>
Вы должны взглянуть на функцию get_headers(). Он вернет хеш HTTP-заголовков из HTTP-запроса. Content-length
заголовок может лучше судить о размере реального контента, если он присутствует.
При этом вам действительно следует использовать curl или streams для выполнения HEAD-запроса вместо GET. Content-length
должен присутствовать, что спасает вас от передачи. Это будет и быстрее, и точнее.
Он извлечет весь файл и затем вычисляет размер файла (а точнее длину строки) из полученных данных. обычно размер файла может указывать размер файла непосредственно из файловой системы без предварительного чтения всего файла.
так что это будет довольно медленно, и каждый раз будет извлекать весь файл, прежде чем сможет получить размер файла (длина строки