4

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

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

这就是我检查 curl 错误的方式

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 多模式下不起作用(请参阅错误报告)。相反,我们应该使用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()。有什么解决办法吗?

=======

4

0 回答 0