Getting HTTP code in PHP using curl
Solution 1
First make sure if the URL is actually valid (a string, not empty, good syntax), this is quick to check server side. For example, doing this first could save a lot of time:
if(!$url || !is_string($url) || ! preg_match('/^http(s)?:\/\/[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(\/.*)?$/i', $url)){
return false;
}
Make sure you only fetch the headers, not the body content:
@curl_setopt($ch, CURLOPT_HEADER , true); // we want headers
@curl_setopt($ch, CURLOPT_NOBODY , true); // we don't need body
For more details on getting the URL status http code I refer to another post I made (it also helps with following redirects):
As a whole:
$url = 'http://www.example.com';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, true); // we want headers
curl_setopt($ch, CURLOPT_NOBODY, true); // we don't need body
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT,10);
$output = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo 'HTTP code: ' . $httpcode;
Solution 2
// must set $url first....
$http = curl_init($url);
// do your curl thing here
$result = curl_exec($http);
$http_status = curl_getinfo($http, CURLINFO_HTTP_CODE);
curl_close($http);
echo $http_status;
Solution 3
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$rt = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info["http_code"];
Solution 4
Try PHP's "get_headers" function.
Something along the lines of:
<?php
$url = 'http://www.example.com';
print_r(get_headers($url));
print_r(get_headers($url, 1));
?>
Solution 5
curl_getinfo
— Get information regarding a specific transfer
Check curl_getinfo
<?php
// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');
// Execute
curl_exec($ch);
// Check if any error occurred
if(!curl_errno($ch))
{
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
}
// Close handle
curl_close($ch);
Related videos on Youtube
Aaran McGuire
Updated on July 16, 2022Comments
-
Aaran McGuire almost 2 years
I'm using CURL to get the status of a site, if it's up/down or redirecting to another site. I want to get it as streamlined as possible, but it's not working well.
<?php $ch = curl_init($url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_TIMEOUT,10); $output = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return $httpcode; ?>
I have this wrapped in a function. It works fine but performance is not the best because it downloads the whole page, thing in if I remove
$output = curl_exec($ch);
it returns0
all the time.Does anyone know how to make the performance better?
-
Sk8erPeter over 11 yearsI edited your post and pasted the working example code as a whole. I find it this way more helpful. Btw., +1 for mentioning CURLOPT_HEADER and CURLOPT_NOBODY settings! :)
-
Brainware about 9 yearsIt is not necessary to set CURLOPT_HEADER to true. You still get the httpcode from curl_getinfo() either way.
-
Mike_K over 7 yearsThis one does not require ignoring the body and only makes one call, making it my preferred answer as well.
-
Mike Kormendy about 7 yearsGetheaders is slow compared to curl.
-
Mike Kormendy about 7 yearsGet headers is slow compared to curl.
-
sshow almost 6 yearsAs of PHP 5.5.0 and cURL 7.10.8, this [CURLINFO_HTTP_CODE] is a legacy alias of CURLINFO_RESPONSE_CODE (ref)
-
itoctopus almost 6 yearsFor some reason this line
curl_setopt($ch, CURLOPT_NOBODY, true);
is hanging. Not sure if this is related to the server's PHP version. -
Ugur Kazdal about 5 yearswhy don't you use cron or webhook instead of using sleep and endless loop ?
-
funder7 almost 3 yearsChecking the doc in 2021:
As of PHP 5.5.0 and cURL 7.10.8, this is a legacy alias of CURLINFO_RESPONSE_CODE