2009-12-04 16 views
1

使用PHP和CURL(除非在这种情况下有更好的选择,那么CURL),是否可以在下载文件之前使用PHP函数处理头响应?在下载主体之前处理CURL头文件

例如:

我有下载和进程的URL由用户提供的脚本。我想添加一个检查,以便如果该文件对我的进程无效(不是文本文件,太大等),CURL请求将在服务器浪费时间下载文件之前取消。

更新:解决方案 PEAR类HTTP_Request2:http://pear.php.net/package/HTTP_Request2/ 给你观察员设置为连接,并抛出异常,以随时取消的能力。完美满足我的需求!

+0

我发现在卷曲“CURLOPT_HEADERFUNCTION”,让您为标题回调函数的一个选项,但你不能从回调内部取消请求。你会得到这样的错误:“尝试在良好的编程设计中关闭cURL句柄回调” – Greg 2009-12-04 21:50:05

+0

,不应该为“正常”操作抛出异常,因为通常异常在算法上是昂贵的。他们应该只适用于很少发生的操作,如错误或不正确的行为。 – zmo 2012-05-27 16:35:53

+0

要放弃从为'CURLOPT_HEADERFUNCTION'或其他'CURLOPT_ * FUNCTION'选项定义的回调函数内下载响应流,请将您的回调函数返回为'-1'。 – lafor 2013-07-03 10:39:46

回答

6

使用cURL,执行HTTP HEAD请求来检查标头,然后如果它有效(状态为200),请执行完整的HTTP GET请求。

必须设置的基本选项CURLOPT_NOBODY,从而改变了请求类型HEAD

curl_setopt($ch, CURLOPT_NOBODY, true); 

然后执行查询后,您需要检查哪些是可以做到用返回的状态curl_getinfo()

$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
+0

但即使没有代码示例 – streetparade 2009-12-04 21:39:04

+0

没有帮助。它确切地解释了如何做到这一点。 – Yacoby 2009-12-04 21:49:10

+1

确实如此,但必须为每个网址发送两个请求/连接似乎很浪费。 – Greg 2009-12-04 21:50:54

1

这是你如何解决这个问题的例子:

// Include the Auth string in the headers 
// Together with the API version being used 
$headers = array(
    "Authorization: GoogleLogin auth=" . $auth, 
    "GData-Version: 3.0", 
); 

// Make the request 
curl_setopt($curl, CURLOPT_URL, "http://docs.google.com/feeds/default/private/full"); 
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 

$response = curl_exec($curl); 
curl_close($curl); 

// Parse the response 
$response = simplexml_load_string($response); 

// Output data 
foreach($response->entry as $file) 
{ 
     //now you can do what ever if file type is a txt 
     //if($file->title =="txt") 
     // do something 
     else 
     // do soething 
    echo "File: " . $file->title . "<br />"; 
    echo "Type: " . $file->content["type"] . "<br />"; 
    echo "Author: " . $file->author->name . "<br /><br />"; 
} 
+0

除了标题之外,它还下载了url的主体。重点是获取标题,然后可以选择在需要的时候在主体之前停止连接。 – Greg 2009-12-04 21:52:06

3

我知道这是一个古老的话题,但以防人们在未来来到这里。

使用CURL,您可以使用CURLOPT_WRITEFUNCTION,让您放置一个回调,一旦身体响应开始到来并需要写入回调,就会调用回调。在那一刻,您可以阅读标题并取消流程,并且不会下载正文。所有在一个请求。

为了更深入地了解和代码示例,请参阅PHP/Curl: inspecting response headers before downloading body