Разбор HTTP заголовка из fsockopen с помощью PHP? - PullRequest
0 голосов
/ 20 февраля 2012

У меня настроен сценарий, который по причинам необходимости получает как заголовок HTTP-ответа, так и содержимое запроса GET с использованием fsock.

function checkUrl($host,$url,$port) {
$fp = fsockopen($host, $port, $errno, $errstr, 10);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET $url HTTP/1.1\r\n";
    $out .= "Host: $host\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $response = fgets($fp, 1024);
        print(substr($response,9,3));
    }
    fclose($fp);
}
}

Я звоню и получаю все нужные данные, если просто повторяю все это. Но на самом деле все, что мне нужно вернуть из функции, - это HTTP-код STATUS.

т.е. 404 или 200 или 301 и т. Д.

Но приведенный выше код дает код ошибки точно, но затем с грузом тарабарщины в конце, который я не понимаю, когда я ограничен 3 символами!

например.

404, 2BM_n: Encype HThe tp-me=srcsrclanstaPre> lanmg=[0][1][2][3][4][5][6][7][8][9][10[11[12 swt.i> ypeeleamiize#99eco#66ade#33izeine#CCize { #66izeeig tmardespath=th=th=th=th=th=th=spardeolordeignign bocol widwidwid col bler> td Sorabl> e> rdeolordespath=th=th= bo spardeoloe="lanSen>

Что заставляет меня верить, что мой ответ на самом деле более сложный, чем просто строка, верно? Что-то особенное в шапке или я неправильно понимаю, как работает fgets? Любая помощь высоко ценится

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

В данный момент вы перебираете каждую строку заголовка / ответа, даже если вас интересует только первая строка. Попробуйте вместо этого:

while (!feof($fp)) {
    $response = fgets($fp, 1024);
    $code = substr($response,9,3);
    if (is_numeric($code)) {
        $break;
     }
}

// $code should contain the response code

Если вас интересуют только заголовки, а не ответ, я бы посоветовал вам сделать запрос HEAD вместо GET.

Если нет действительно веской причины, чтобы я не предлагал вам сделать этот запрос, используя CURL, а не пытаться обрабатывать все низкоуровневые вещи в логике вашего PHP-приложения.

1 голос
/ 20 февраля 2012

Проблема в том, что вы печатаете эту подстроку для каждого блока из 1024 символов вместо только первого.Решение состоит в том, чтобы не делать петлю.Измените это:

while (!feof($fp)) {
    $response = fgets($fp, 1024);
    print(substr($response,9,3));
}

На это:

$response = fgets($fp, 1024);
print(substr($response,9,3));

Или даже просто так, поскольку вам нужны только первые 13 символов, а не первые 1024:

$response = fgets($fp, 13);
print(substr($response,9,3));
...