Ответ 1
Да. Поскольку файл удален, вы полностью зависите от значения заголовка Content-Length
(если вы не хотите загрузить весь файл). Вы захотите curl_setopt($ch, CURLOPT_NOBODY, true)
и curl_setopt($ch, CURLOPT_HEADER, true)
.
Я думал о том, чтобы сделать запрос главы с 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. См. Список поддерживаемых Протоколы/Упаковщики для распечатки из которых обертки поддерживают 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));