Код ответа HTTP после перенаправления

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

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

Заранее благодарю за любое предложение.

Solutions Collecting From Web of "Код ответа HTTP после перенаправления"

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

Вам нужен только запрос HEAD, а затем разобрать заголовки и вернуть последний код состояния. Ниже приведен пример кода, который делает это, он использует $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; } эта $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; } не $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 Streams , в конце он содержит пример кода, как вы можете делать запрос HEAD с get_headers .

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

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

  $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 ...) 

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