2010-08-07 99 views
11

我使用PHP的cURL函數從steampowered.com讀取配置文件。檢索的數據是XML,只需要大約1000字節。無法限制PHP的cURL函數的下載大小

我正在使用的方法是添加一個Range標題,我在堆棧溢出答案(curl: How to limit size of GET?)上閱讀。我嘗試過的另一種方法是使用curlopt_range,但那也不起作用。

<? 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_HTTPHEADER, array("Range: bytes=0-1000")); 

$data_string = curl_exec($curl_handle); 

echo $data_string; 

curl_close($curl_handle); 
?> 

當執行此代碼時,它將返回整個事物。

我正在使用PHP版本5.2.14。

+3

你確定你要查詢的服務器支持範圍嗎?因爲當我從命令行嘗試時,我也得到了整個文檔,這導致我相信steamcommunity.com沒有啓用該功能 – Doon 2010-08-07 19:19:59

回答

18

服務器不遵守範圍標題。您可以做的最好的辦法是在您收到比您想要的更多數據時立即取消連接。例如:

<?php 
$curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; 
$curl_handle = curl_init($curl_url); 

$data_string = ""; 
function write_function($handle, $data) { 
    global $data_string; 
    $data_string .= $data; 
    if (strlen($data_string) > 1000) { 
     return 0; 
    } 
    else 
     return strlen($data); 
} 

curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function'); 

curl_exec($curl_handle); 

echo $data_string; 

也許更乾淨,你可以使用HTTP包裝(這也將使用捲曲,如果它與--with-curlwrappers編譯)。基本上,如果您獲得的數據超過您的要求,您可以在循環中調用fread,然後在流上使用fclose。您也可以使用傳輸流(如果allow_url_fopen已禁用,則使用fsockopen而不是fopen打開流並手動發送標題)。

+0

這確實有效!雖然,我不完全理解CURLOPT_WRITEFUNCTION的機制。你能解釋那裏發生了什麼?再次感謝。 – Curtis 2010-08-07 19:53:35

+1

@Cur每次接收到新數據時,它都會被curl擴展調用。回調接收curl處理程序和剛纔讀取的數據。它應該返回讀取的字節數,如果沒有,它會中止傳輸(雖然這最後一部分沒有記錄,它似乎是行爲)。 – Artefacto 2010-08-07 20:01:41

+2

@Cur OK我在這裏找到了文檔:「返回實際處理的字節數,如果這個數量與傳遞給函數的數量不同,它會向庫發出一個錯誤信號,這會中止傳輸並返回CURLE_WRITE_ERROR「。 http://curl.haxx.se/libcurl/c/curl_easy_setopt.html – Artefacto 2010-08-07 20:06:39