Getting HTTP code in PHP using curl

300,187

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);
Share:
300,187

Related videos on Youtube

Aaran McGuire
Author by

Aaran McGuire

Updated on July 16, 2022

Comments

  • Aaran McGuire
    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 returns 0 all the time.

    Does anyone know how to make the performance better?

  • Sk8erPeter
    Sk8erPeter over 11 years
    I 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
    Brainware about 9 years
    It is not necessary to set CURLOPT_HEADER to true. You still get the httpcode from curl_getinfo() either way.
  • Mike_K
    Mike_K over 7 years
    This one does not require ignoring the body and only makes one call, making it my preferred answer as well.
  • Mike Kormendy
    Mike Kormendy about 7 years
    Getheaders is slow compared to curl.
  • Mike Kormendy
    Mike Kormendy about 7 years
    Get headers is slow compared to curl.
  • sshow
    sshow almost 6 years
    As of PHP 5.5.0 and cURL 7.10.8, this [CURLINFO_HTTP_CODE] is a legacy alias of CURLINFO_RESPONSE_CODE (ref)
  • itoctopus
    itoctopus almost 6 years
    For 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
    Ugur Kazdal about 5 years
    why don't you use cron or webhook instead of using sleep and endless loop ?
  • funder7
    funder7 almost 3 years
    Checking the doc in 2021: As of PHP 5.5.0 and cURL 7.10.8, this is a legacy alias of CURLINFO_RESPONSE_CODE