Игнорировать заголовок длины содержимого при использовании File_get_contents
-
27-10-2019 - |
Вопрос
Мне нужно получить содержимое страницы, которая всегда отправляет Content-Length: 0
Заголовок, однако страница никогда не бывает пустой.
А file_get_contents(url)
Просто возвращает пустую строку.
Весь заголовок возвращается страницей:
HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.10
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified: Sat, 18 Feb 2012 18:14:59 GMT
Cache-Control: no-store, no-cache, must-revalidate
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Sat, 18 Feb 2012 18:14:59 GMT
Server: lighttpd
Можно ли использовать file_get_contents и игнорировать заголовок или мне нужно использовать Curl?
Редактировать
get_headers(url)
вывод (с помощью print_r
):
Array
(
[0] => HTTP/1.0 200 OK
[1] => X-Powered-By: PHP/5.3.10
[2] => Content-type: text/html
[3] => Content-Length: 0
[4] => Connection: close
[5] => Date: Sat, 18 Feb 2012 22:39:52 GMT
[6] => Server: lighttpd
)
Решение 2
Как отмечает оптимист, проблема не имела ничего общего с заголовками, а скорее, что я не отправил ни одного заголовка пользователя-агента на сервер.
file_get_contents
работал отлично после отправки заголовков пользователя-агента, хотя сервер всегда возвращается Content-Length: 0
.
Странный.
Другие советы
Я считаю, что ни одна из функций на уровне HTTP не может прочитать такой ответ. Поскольку это неверный http -ответ, он говорит: «Мое тело пустое, не читайте его»
Вам определенно нужна ваша собственная функция на основе Fread, которая физически будет читать гнездо. Что-то вроде этого:
$aURL = parse_url($sURL);
if ($iHandle = fsockopen($aURL["host"], 80, $iError, $sError))
{
$sQuery = substr($sURL, strpos($sURL, $aURL["host"]) + strlen($aURL["host"]));
$sOut = "GET " . (($sQuery != "") ? $sQuery : "/") . " HTTP/1.1\r\n";
$sOut .= "Host: " . $aURL["host"] . "\r\n";
$sOut .= "Connection: Close\r\n\r\n";
fputs($iHandle, $sOut);
while (!feof($iHandle))
{
$sResult .= fread($iHandle, 1024);
}
}
Тогда просто порежьте заголовки.