HTTP код ответа после перенаправления - PullRequest
6 голосов
/ 27 сентября 2011

Существует перенаправление на сервер для получения информации, и как только ответ приходит с сервера, я хочу проверить HTTP-код, чтобы выдать исключение, если есть какой-либо код, начинающийся с 4XX. Для этого мне нужно знать, как я могу получить только HTTP-код из заголовка? Также здесь происходит перенаправление на сервер, так что я боюсь, что curl мне не пригодится.

До сих пор я пробовал это решение , но оно очень медленное и создает время ожидания сценария в моем случае. Я не хочу увеличивать время ожидания сценария и ждать дольше, чтобы получить HTTP-код.

Заранее спасибо за любые предложения.

Ответы [ 3 ]

9 голосов
/ 27 сентября 2011

Ваш метод с get_headers и запросом первой строки ответа вернет код состояния перенаправления (если есть) и , что более важно, он выполнит запрос GET, который передаст весь файл.

Вам нужен только запрос HEAD, а затем анализировать заголовки и возвращать код состояния last . Ниже приведен пример кода, который делает это, он использует $http_response_header вместо get_headers, но формат массива тот же:

$url = 'http://example.com/';

$options['http'] = array(
    'method' => "HEAD",
    'ignore_errors' => 1,
);

$context = stream_context_create($options);

$body = file_get_contents($url, NULL, $context);

$responses = parse_http_response_header($http_response_header);

$code = $responses[0]['status']['code']; // last status code

echo "Status code (after all redirects): $code<br>\n";

$number = count($responses);

$redirects = $number - 1;

echo "Number of responses: $number ($redirects Redirect(s))<br>\n";

if ($redirects)
{
    $from = $url;

    foreach (array_reverse($responses) as $response)
    {
        if (!isset($response['fields']['LOCATION']))
            break;
        $location = $response['fields']['LOCATION'];
        $code = $response['status']['code'];

        echo " * $from -- $code --> $location<br>\n";
        $from = $location;
    }
    echo "<br>\n";
}

/**
 * parse_http_response_header
 *
 * @param array $headers as in $http_response_header
 * @return array status and headers grouped by response, last first
 */
function parse_http_response_header(array $headers)
{
    $responses = array();
    $buffer = NULL;
    foreach ($headers as $header)
    {
        if ('HTTP/' === substr($header, 0, 5))
        {
            // add buffer on top of all responses
            if ($buffer) array_unshift($responses, $buffer);
            $buffer = array();

            list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, '');

            $buffer['status'] = array(
                'line' => $header,
                'version' => $version,
                'code' => (int) $code,
                'phrase' => $phrase
            );
            $fields = &$buffer['fields'];
            $fields = array();
            continue;
        }
        list($name, $value) = explode(': ', $header, 2) + array('', '');
        // header-names are case insensitive
        $name = strtoupper($name);
        // values of multiple fields with the same name are normalized into
        // a comma separated list (HTTP/1.0+1.1)
        if (isset($fields[$name]))
        {
            $value = $fields[$name].','.$value;
        }
        $fields[$name] = $value;
    }
    unset($fields); // remove reference
    array_unshift($responses, $buffer);

    return $responses;
}

Для получения дополнительной информации см .: Сначала HEAD с потоками PHP , в конце он содержит пример кода, как вы также можете выполнить запрос HEAD с помощью get_headers.

Похожие: Как проверить, существует ли удаленный файл с использованием PHP?

6 голосов
/ 27 сентября 2011

Что-то вроде:

  $ch = curl_init(); 
  $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE );

Вам следует попробовать класс HttpEngine.Надеюсь, это поможет.

-

РЕДАКТИРОВАТЬ

$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $your_agent_variable);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $your_referer);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpcode ...)
0 голосов
/ 27 сентября 2011

Решение, которое вы нашли, выглядит хорошо.Если сервер не может вовремя отправить вам заголовки http, ваша проблема в том, что другой сервер сломан или находится под очень большой нагрузкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...