Retrieve response headers from PHP cURL
There are two ways to get response headres from PHP cURL.
1. Using CURLOPT_HEADER option
With the curl_setopt()
method, when CURLOPT_HEADER
is set to true, curl_exec
will output response header. At this time, if CURLOPT_NOBODY
is set to false, curl_setopt()
will return the response header and content body, otherwise only the response header will be returned.
We can use curl_getinfo($ch, CURLINFO_HEADER_SIZE)
method to return total size of all headers received.
$url = "https://www.google.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// TRUE to exclude the body from the output.
curl_setopt($ch, CURLOPT_NOBODY, 0);
$response = curl_exec($ch);
// After curl_exec
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
echo $header;
// echo $body;
Output
HTTP/1.1 200 OK
Date: Tue, 28 Apr 2020 15:11:27 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2020-04-28-15; expires=Thu, 28-May-2020 15:11:27 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=203=DasuCttFxUVDirSokzwSf91r3PD60lDxlFogt2-rg5m0BCbhSeCpWcIlJVAmuLiDUkXmBTXuVbKEcP8gT0ifJzTu1MW-9UfriAyIqPESXl2H6fOsb9mvDZH8ng4Nb_YQk4Xv1uMFpCMiVf6GSHZS7dje2cjq1qvgyFiQfb3bOTA; expires=Wed, 28-Oct-2020 15:11:27 GMT; path=/; domain=.google.com; HttpOnly
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
Accept-Ranges: none
Vary: Accept-Encoding
Transfer-Encoding: chunked
2. Using CURLOPT_HEADERFUNCTION option
With the CURLOPT_HEADERFUNCTION
option, we can set a callback function.
$headers = [];
$url = "https://www.google.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION,
function ($curl, $header) use (&$headers) {
$len = strlen($header);
$header = explode(':', $header, 2);
if (count($header) < 2) // ignore invalid headers
return $len;
$headers[strtolower(trim($header[0]))][] = trim($header[1]);
return $len;
}
);
$response = curl_exec($ch);
print_r($headers);
Output
Array
(
[date] => Array
(
[0] => Tue, 28 Apr 2020 15:12:50 GMT
)
[expires] => Array
(
[0] => -1
)
[cache-control] => Array
(
[0] => private, max-age=0
)
[content-type] => Array
(
[0] => text/html; charset=ISO-8859-1
)
[p3p] => Array
(
[0] => CP="This is not a P3P policy! See g.co/p3phelp for more info."
)
[server] => Array
(
[0] => gws
)
[x-xss-protection] => Array
(
[0] => 0
)
[x-frame-options] => Array
(
[0] => SAMEORIGIN
)
[set-cookie] => Array
(
[0] => 1P_JAR=2020-04-28-15; expires=Thu, 28-May-2020 15:12:50 GMT; path=/; domain=.google.com; Secure
[1] => NID=203=ZC5X9W1OFIFk7p_y1HUQ1ZhluIAq1QMJcoiaWNvjtggga9w0By1ULn01BaSxfswmYixQ8arShOwTpHMWyDRXu6vy5xdS19FmFYLyUsdz0n5wOs9_dkb4xBPLOc4SRKdZN7QhcgS8sMVwugrM-CEyg2ENJq_t__UJlwM2cgOdyfg; expires=Wed, 28-Oct-2020 15:12:50 GMT; path=/; domain=.google.com; HttpOnly
)
[alt-svc] => Array
(
[0] => quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,h3-T050=":443"; ma=2592000
)
[accept-ranges] => Array
(
[0] => none
)
[vary] => Array
(
[0] => Accept-Encoding
)
[transfer-encoding] => Array
(
[0] => chunked
)
)