PHP cURL HTTP CODE return 0
PhpCurlPhp Problem Overview
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);
Php Solutions
Solution 1 - Php
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);
Solution 2 - Php
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.
Solution 3 - Php
check the curl_error after the curl_getinfo to find out the hidden errors.
if(curl_errno($ch)){
echo 'Curl error: ' . curl_error($ch);
}
Solution 4 - Php
Try this:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Solution 5 - Php
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()
.
Solution 6 - Php
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.
Solution 7 - Php
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.
Solution 8 - Php
If you're using selinux it might be because of security restrictions. Try setting this as root:
# setsebool -P httpd_can_network_connect on
Solution 9 - Php
For me, issue wat the URL, untill I encoded url parameter values, I got http code 0.
Solution 10 - Php
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).
Solution 11 - Php
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);