2009-12-04 39 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