Ardeus
Ardeus

Reputation: 2001

PHP cURL HTTP CODE return 0

I dont understand when I echo $httpCode I always get 0, I was expecting 404 when I change $html_brand into a broken url. Is there anything that I miss or do not know of? Thanks.

 //check if url exist
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $html_brand);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($httpCode == 404) {
    echo "The Web Page Cannot Be Found";
    return;
}
curl_close($ch);

Upvotes: 128

Views: 229414

Answers (12)

Dbertovi
Dbertovi

Reputation: 51

In my case, I get CURLINFO_RESPONSE_CODE 0 (zero) whenever I have whitespace (i.e. URL is not encoded) in the URL. And literally anywhere in the URL (address part, query part, any). So, this is not good:

https://my.do main.com //(this is never good)

or

https://my.domain.com?date=2022-12-29 13:55:10&type=apparel //you can see how date formatting breaks the query for cURL

etc. Obviously, a requested link or parts of it must be assembled properly and parameter values of it in the url query must be percent encoded if a value can, by the definition, contain an empty string. I know this is not some big issue, but I had such a case, and I don't see it in the answers here.

Upvotes: 1

Maxim Mandrik
Maxim Mandrik

Reputation: 447

Also check the order in which the commands are executed.

First curl_exec and then curl_getinfo.

$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

Upvotes: 5

temo
temo

Reputation: 698

For me, issue wat the URL, untill I encoded url parameter values, I got http code 0.

Upvotes: 1

Samo
Samo

Reputation: 2181

If you're using selinux it might be because of security restrictions. Try setting this as root:

# setsebool -P httpd_can_network_connect on

Upvotes: 2

Meldo
Meldo

Reputation: 163

Try this:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

Upvotes: 8

Another reason for PHP to return http code 0 is timeout. In my case, I had the following configuration:

curl_setopt($http, CURLOPT_TIMEOUT_MS,500);

It turned out that the request to the endpoint I was pointing to always took more than 500 ms, always timing out and always returning http code 0.

If you remove this setting (CURLOPT_TIMEOUT_MS) or put a higher value (in my case 5000), you'll get the actual http code, in my case a 200 (as expected).

See https://www.php.net/manual/en/function.curl-setopt.php

Upvotes: 3

Gondy
Gondy

Reputation: 5295

I had same problem and in my case this was because curl_exec function is disabled in php.ini. Check for logs:

PHP Warning:  curl_exec() has been disabled for security reasons in /var/www/***/html/test.php on line 18

Solution is remove curl_exec from disabled functions in php.ini on server configuration file.

Upvotes: 3

Daniel
Daniel

Reputation: 419

check the curl_error after the curl_getinfo to find out the hidden errors.

if(curl_errno($ch)){   
    echo 'Curl error: ' . curl_error($ch);
}

Upvotes: 13

CodeCaster
CodeCaster

Reputation: 151586

Like said here and below, a failed request (i.e. the server is not found) returns false, no HTTP status code, since a reply has never been received.

Call curl_error().

Upvotes: 4

Hereblur
Hereblur

Reputation: 2164

Try this after curl_exec to see what's the problem:

print curl_error($ch);

If it's print something like 'malformed' then check your URL format.

Upvotes: 115

craniumonempty
craniumonempty

Reputation: 3535

If you connect with the server, then you can get a return code from it, otherwise it will fail and you get a 0. So if you try to connect to "www.google.com/lksdfk" you will get a return code of 400, if you go directly to google.com, you will get 302 (and then 200 if you forward to the next page... well I do because it forwards to google.com.br, so you might not get that), and if you go to "googlecom" you will get a 0 (host no found), so with the last one, there is nobody to send a code back.

Tested using the code below.

<?php

$html_brand = "www.google.com";
$ch = curl_init();

$options = array(
    CURLOPT_URL            => $html_brand,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER         => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_ENCODING       => "",
    CURLOPT_AUTOREFERER    => true,
    CURLOPT_CONNECTTIMEOUT => 120,
    CURLOPT_TIMEOUT        => 120,
    CURLOPT_MAXREDIRS      => 10,
);
curl_setopt_array( $ch, $options );
$response = curl_exec($ch); 
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo "<pre>".htmlspecialchars($response)."</pre>";
}

curl_close($ch);

Upvotes: 116

psx
psx

Reputation: 4048

What is the exact contents you are passing into $html_brand?

If it is has an invalid URL syntax, you will very likely get the HTTP code 0.

Upvotes: 2

Related Questions