2010-07-15 5 views
2

Я смотрел PHP-документы для fsockopen и еще ничего, и они говорят, что вы не можете использовать filesize() в удаленном файле, не делая каких-то сумасшедших вещей с ftell или чем-то (не уверен, что они сказали точно), но я подумал о том, как это сделать:PHP: получить удаленный размер файла с помощью strlen? (html)

$file = file_get_contents("http://www.google.com"); 
$filesize = mb_strlen($file)/1000; //KBs, mb_* in case file contains unicode 

Будет ли это хорошим методом? Это было так просто и полезно использовать в то время, просто хочу получить какие-либо мысли, если это может столкнуться с проблемами или не быть истинным размером файла.

Я только хочу использовать это на тексте (сайтах), кстати, не бинарный.

+1

A Kilobyte имеет 1024 байта не 1000, как предлагает ваше подразделение. – 2011-08-31 18:25:24

ответ

0

он будет извлекать весь файл, а затем вычислять размер файла (а не длину строки) из извлеченных данных. обычно filesize может сообщать файлы непосредственно из файловой системы, не читая сначала весь файл.

так что это будет довольно медленно, и каждый раз получать весь файл, прежде чем быть в состоянии извлечь FileSize (длина строки

+0

А? если он внешний, это не в вашей файловой системе, и вам нужно будет использовать ftell и т. д., чтобы прочитать байты, которые он передает, и вычислить размер, основанный на этом. Я просто упоминал, было бы проще для текстовых внешних объектов. –

3

Вы должны смотреть на функции get_headers(). Она возвращает хэш HTTP заголовков из запрос HTTP. заголовок Content-length может быть лучшим судьей размера фактического содержания, если он присутствует.

это, как говорится, вы действительно должны использовать либо curl или streams сделать запрос HEAD, вместо GET. Content-length должен быть представлен, что избавит вас от передачи. Это будет как быстрее, так и точнее.

+0

Звучит неплохо, но Content-Length, кажется, не на одном веб-сайте, на который я смотрю, так любезно, хотя я могу использовать это вместо моего метода, если он существует. –

+0

Он может варьироваться в зависимости от типа содержимого. Если настоящий физический файл обслуживается, он должен присутствовать. Если содержимое сжато, оно должно присутствовать. Если контент генерируется скриптом, он может отсутствовать ... – Charles

5

Этот ответ требует 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); 
} 
?> 
+0

У вас никогда не было смысла отвечать на этот ответ - но это золото! –

+0

@Tal - Я должен спросить, как вы на самом деле используете это? Проверить, работает ли сервер? –

 Смежные вопросы

  • Нет связанных вопросов^_^