PHP: получить размер удаленного файла с помощью strlen? (html)

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

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

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

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


person John D.    schedule 15.07.2010    source источник
comment
Килобайт имеет 1024 байта, а не 1000, как предлагает ваше подразделение.   -  person    schedule 31.08.2011


Ответы (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);
}
?>
person Mark Eirich    schedule 15.07.2010
comment
Вы никогда не получали балла за этот свой ответ, но это золото! - person Tal Galili; 09.10.2010
comment
@Tal - я должен спросить, как ты на самом деле это используешь? Чтобы следить за тем, работает ли сервер? - person Mark Eirich; 05.02.2011

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

При этом вам действительно следует использовать либо curl, либо < href="http://us2.php.net/manual/en/context.http.php" rel="nofollow noreferrer">потоки для выполнения запроса HEAD вместо GET. Content-length должен присутствовать, что избавит вас от перевода. Это будет и быстрее, и точнее.

person Charles    schedule 15.07.2010
comment
Звучит хорошо, но Content-Length, похоже, нет ни на одном веб-сайте, который я просматриваю, так что это сомнительно, хотя я могу использовать его вместо моего метода, если он существует. - person John D.; 15.07.2010
comment
Он может варьироваться в зависимости от типа контента. Если обслуживается фактический физический файл, он должен присутствовать. Если содержимое сжато, оно должно присутствовать. Если контент генерируется скриптом, он может отсутствовать... - person Charles; 15.07.2010

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

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

person knittl    schedule 15.07.2010
comment
Хм? если он внешний, его нет в вашей файловой системе, и вам нужно будет использовать ftell и т. д., чтобы прочитать байты, которые он передает, и вычислить размер на основе этого. Я просто упомянул, будет ли это проще для текстовых внешних объектов. - person John D.; 15.07.2010