出于某种原因,当我尝试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()。任何解决方案?
=======