Your method with get_headers
and requesting the first line of response will return a redirection status code (if any), and, more importantly, it will execute a GET request that will transfer the entire file.
You only need a HEAD request and then parse the headers and return the last status code. The following is sample code that does this using $http_response_header
instead of get_headers
, but the array format is the same:
$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; }
For more information, see HEAD first with PHP streams , at the end it contains sample code on how you can execute a HEAD request with get_headers
.
Related: How to check if a remote file exists using PHP?
source share