如何在curl_multi模式下捕获curl_errno?

时间:2013-08-19 21:20:48

标签: php curl curl-multi

出于某种原因,当我尝试curl_errno($value)这样的网址时,0总是会返回6而不是stkovrflow.com。这是一个不存在的域。所以curl应该返回6。但我得到了0

有人能告诉我我的代码有什么问题吗?

这是我检查卷曲错误的方法

if (curl_errno($value) !== 0)
{
   $handles[$key]['error_code'] = curl_errno($value);
}

这是我的完整代码

<?php

protected function curl($url)
    {

        $mh = curl_multi_init();
        $handles = array();
        foreach ($url as $link)
        {
            $handles[$link] = curl_init($link);

            curl_setopt($handles[$link], CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($handles[$link], CURLOPT_HEADER, true);
            curl_setopt($handles[$link], CURLOPT_RETURNTRANSFER, true);
            curl_setopt($handles[$link],CURLOPT_FAILONERROR,true);
            curl_setopt($handles[$link], CURLOPT_FOLLOWLOCATION, $this->curlFollowLocation);
            curl_setopt($handles[$link], CURLOPT_MAXREDIRS, $this->curlMaxRedirects);
            curl_setopt($handles[$link], CURLOPT_TIMEOUT, $this->curlTimeout);
            curl_setopt($handles[$link], CURLOPT_USERAGENT, $this->curlUserAgent);
            curl_setopt($handles[$link], CURLOPT_AUTOREFERER, true);


            curl_multi_add_handle($mh, $handles[$link]);
        }

        $running = null;


        do {
            curl_multi_exec($mh, $running);
            usleep(200000);
        } while ($running > 0);

        foreach ($handles as $key => $value)
        {
            $handles[$key] = false;
            $handles[$key]['error_code'] = false;
            if (curl_errno($value) !== 0)
            {
                $handles[$key]['error_code'] = curl_errno($value);
            } else {
                $response = curl_multi_getcontent($value);
                $httpCode = curl_getinfo($value, CURLINFO_HTTP_CODE);

                if ( $httpCode != 200 ) {
                    $handles[$key]['error_code'] = $httpCode;
                } else {

                    $handles[$key]['html'] = $response;

                }
            }
            curl_multi_remove_handle($mh, $value);
            curl_close($value);
        }

        curl_multi_close($mh);
        return $handles;
    }  

更新

看起来curl_errno在curl multi模式下不起作用(see bug report)。相反,我们应该使用curl_multi_info_read。当我像这样使用curl_multi_info_read

$e_code = curl_multi_info_read($mh);
var_dump($e_code);

这是我的var_dump输出。

array (size=3)
  'msg' => int 1
  'result' => int 6
  'handle' => resource(7, curl)

尽可能正确地返回6。但是php doc说

  

返回的资源指向的数据将无法在调用curl_multi_remove_handle()后继续存在。

不幸的是我的脚本依赖于curl_multi_remove_handle()。任何解决方案?

=======

0 个答案:

没有答案