Я думал о том, чтобы сделать запрос на голову с помощью cURL, было интересно, не так ли это?
Да. Поскольку файл удален, вы полностью зависите от значения заголовка Content-Length
(если вы не хотите загрузить весь файл). Вам нужно будет curl_setopt($ch, CURLOPT_NOBODY, true)
и curl_setopt($ch, CURLOPT_HEADER, true)
.
Лучшее решение, которое следует принципу KISS
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); $filesize = $head['content-length'];
Я предполагаю, что использование curl для отправки запроса HEAD – хорошая возможность; что-то вроде этого, вероятно, будет:
$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);
И вы получите:
float 3438
Таким образом, вы используете запрос HEAD и не загружаете весь файл. Тем не менее, вы полагаетесь на удаленный сервер, отправляете правильный заголовок Content-length.
Другим вариантом, о котором вы могли подумать, было бы использовать filesize
… Но это не удастся : в документации указано (цитирование) :
Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми обертками URL. См. Список поддерживаемых протоколов / Wrappers для списка, в которых обертки поддерживают семейство функций stat ().
И, к сожалению, с обертками HTTP и HTTPS , stat()
не поддерживается …
Если вы попытаетесь, вы получите сообщение об ошибке:
Warning: filesize() [function.filesize]: stat failed for http://sstatic.net/so/img/logo.png
Очень жаль 🙁
Использование запроса HEAD и проверка Content-Length
– это стандартный способ сделать это, но вы не можете полагаться на него в целом, так как сервер может его не поддерживать. Заголовок Content-Length
является необязательным, и, кроме того, сервер может даже не реализовать метод HEAD. Если вы знаете, какой сервер вы исследуете, то вы можете проверить, работает ли он, но в качестве общего решения оно не является доказательством пули.
Если вам не нужен пуленепробиваемый раствор, вы можете просто сделать:
strlen(file_get_contents($url));