PHP - curl_exec()可以返回部分结果吗?

时间:2017-09-11 05:19:28

标签: php curl

我使用PHP内置的cURL函数来发出一些请求并捕获标题(用于显示标题的特定目的)。它通常运作良好。我设置了curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);,因此将遵循重定向,最后,每个HTTP请求都会有一组标头,包括所有重定向。

问题在于,有时候重定向会“过时”。并指向不再存在的域。在这种情况下,curl_exec( )会抛出错误并且不返回任何数据。

然而,在我这里的具体用法中,curl_exec( )返回"到目前为止所做的任何事情都非常有用"如果出现错误,我至少可以显示所有可用页面的标题,并且您将能够看到它出错的地方。但我无法找到任何方法来实现这一目标。

$ch = curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLINFO_HEADER_OUT,true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);
$result = curl_exec($ch);

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

也许您可以使用CURLOPT_HEADERFUNCTION来获取标题?

$received_headers=array();
curl_setopt($ch,CURLOPT_HEADERFUNCTION,function($ch,string $header) use(&$received_headers):int{
    $received_headers[]=$header;
    return strlen($header);
});
curl_exec($ch);
var_dump($received_headers);

说,在这种情况下,我会更乐意使用CURLOPT_VERBOSE提供的所有调试数据 - 这不只是给你标题,但是如果有连接丢弃或类似的任何东西,它会告诉你,所以除了你收到的标题之外,你对发生的事情有所了解。所以相反,我会建议像:

$debug_str='';
$debugfileh=tmpfile();
$debugfile=stream_get_meta_data($debugfileh)['uri'];
curl_setopt_array($ch,array(
    CURLOPT_VERBOSE=>true,
    CURLOPT_STDERR=>$debugfileh
));
curl_exec($ch);
$debug_str=file_get_contents($debugfile);
fclose($debugfileh);
unset($debugfile,$debugfileh);
var_dump($debug_str);

请注意,上面的解决方案会为您提供标题,但不会为response body recieved so far(如果有),为此,您可能需要将两者(CURLOPT_HEADERFUNCTION或CURLOPT_VERBOSE)和CURLOPT_WRITEFUNCTION

组合在一起

编辑:修复了第二段代码中的一些错误,我编写的原始代码只会给curl_setopt一些无声错误......