Когда я делаю
$h = get_headers('http://www.weebly.com');
Это работает просто отлично … Заголовки для этой страницы быстро возвращаются.
Но если я попытаюсь получить заголовки через явный запрос HEAD, используя curl …
$url = 'http://www.weebly.com';
$request_headers = array(
'Connection: close',
);
$user_agent = 'curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15';
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_CUSTOMREQUEST => 'HEAD',
CURLOPT_HEADER => TRUE,
CURLOPT_HTTPHEADER => $request_headers,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_FOLLOWLOCATION => TRUE,
CURLOPT_MAXREDIRS => 10,
CURLOPT_USERAGENT => $user_agent,
));
$result = curl_exec($ch);
Запрос не заканчивается.
Что не так с моей настройкой CURL? Это работает для других сайтов для http://www.google.com но для некоторых, таких как поползни, это заканчивается тем, что висит.
Потому что libcurl будет действовать так, как будто используется GET, но вы меняете метод только в фактическом запросе на HEAD, и это все портит, поскольку у ответа HEAD, вероятно, есть заголовок Content-Length: но нет тела ответа.
«Правильный» способ заставить libcurl выполнить HEAD и ожидать ответа HEAD — использовать CURLOPT_NOBODY вместо.
CURLOPT_CUSTOMREQUEST следует использовать только для изменения ключевого слова метода, а не для изменения поведения.
Других решений пока нет …