2015-10-12 461 views
0

你好StackOverflow社区,当我尝试在PHP上使用cURL方法时遇到了一个问题。我试着用此示例代码:PHP curl总是返回http_code 0

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

$options = array(
    CURLOPT_URL   => $html_brand, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_HEADER   => true, 
    CURLOPT_HTTPHEADER  => array("User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"), 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_SSL_VERIFYHOST => false, 
    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); 

,它总是以错误结束,在屏幕上显示它:

返回代码为0的Recv失败:连接被重置

或者在尝试使用https访问任何网站时发生此错误:

返回码为0无法连接到www.goog le.com 443端口:定时 出

这是我的设置:

  • Windows 7专业版32位
  • 的Apache 2.4.12
  • PHP 5.6.11

它是一个代码错误或我还没有考虑任何服务器配置?

Apache中的HTTP_HOST值是localhost:8080,我不确定它是否与我的问题有关,但也许值得注意。

谢谢大家提前。

+0

你检查你的防火墙日志,看是否要求而作出的那么远? –

+0

是这个问题,然后我无法弄清楚什么是不同的黑白答案和问题,看看http://stackoverflow.com/a/10228476/2558525 – Mubin

+0

可能重复的[PHP cURL HTTP代码返回0](http ://stackoverflow.com/questions/10227879/php-curl-http-code-return-0) – Jan

回答

0

我开发了一个自定义函数,对于GET, POST and ajax请求可以正常工作。

所以这里的

function spider($header = array(), $referer = false, $url, $cookie = false,$post = false) 
    { 
     if (!$cookie) 
     { 
      $cookie = "cookie.txt"; 
     } 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate,sdch'); 
     if (isset($header) && !empty($header)) 
     { 
      curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 

     } 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 200); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 
     curl_setopt($ch, CURLOPT_USERAGENT, 
      "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7"); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, realpath($cookie)); 
     curl_setopt($ch, CURLOPT_COOKIEFILE, realpath($cookie)); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     if (isset($referer) && $referer != false) 
     { 
      curl_setopt($ch, CURLOPT_REFERER, $referer); 
     } else 
     { 
      curl_setopt($ch, CURLOPT_REFERER, $url); 
     } 
     //if have to post data on the server 
     if (isset($post) && !empty($post) && $post) 
     { 
      curl_setopt($ch, CURLOPT_POST, true); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 
     } //endif 
     $data = curl_exec($ch); 
     $info = curl_getinfo($ch); 
     print_r($info); 
     curl_close($ch); 
     if($info['http_code'] == 200){ 
      return ($data); 
     }else{ 
      return false; 
     } 
    } 

因此,参数,

$header =>头发送给服务器,这应该是associative array

$referer =>引荐到当前页(如果有的话)。

$url =要获得> URL。

$cookie => cookie文件,应该是在同一水平上,其中调用脚本。

$post =>数据后(如果有的话)

我测试该功能如下。

echo spider(FALSE, FALSE, 'https://www.google.com/ncr'); 

这里是我得到的标题。

Array 
(
[url] => https://www.google.com/ 
[content_type] => text/html; charset=UTF-8 
[http_code] => 200 
[header_size] => 1665 
[request_size] => 701 
[filetime] => -1 
[ssl_verify_result] => 20 
[redirect_count] => 1 
[total_time] => 2.215 
[namelookup_time] => 0 
[connect_time] => 0 
[pretransfer_time] => 0 
[size_upload] => 0 
[size_download] => 9024 
[speed_download] => 4074 
[speed_upload] => 0 
[download_content_length] => 0 
[upload_content_length] => 0 
[starttransfer_time] => 0.437 
[redirect_time] => 1.7 
[certinfo] => Array 
    (
    ) 

[redirect_url] => 
) 

这里是这个请求的快照。

enter image description here

希望这将帮助你...

+0

感谢您的快速回复,不幸的是它并没有解决我的问题,我测试了你的函数,就像你做的那样,我得到了一个数组,其值为0:'Array([url] => https://www.google .com/ncr [content_type] => [http_code] => 0 [header_size] => 0 [request_size] => 0 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] = > 20.218 [namelookup_time] => 0.015 ...',total_time和namelookup_time是其他值不是0的唯一元素。我真的不认为我的问题现在与代码相关,但我可以保留函数作为测试代码未来:) –

+0

请用'phpinfo()'更新您的问题 – Mubin