出于某种原因,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()。有什么解决办法吗?
=======