2013-07-14 145 views
11

是否存在php curl下載的最大大小限制。即當傳輸達到某個文件限制時將捲曲退出?如何設置最大大小限制爲php curl下載

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
$data = curl_exec($ch); 

它爲一個網站,下載遠程圖像。要確保捲曲在達到一定限度時停止。 也我的研究顯示getimagesize()下載圖像,以返回其大小。所以它不是一個選項。

+0

您是否想要以字節或其尺寸獲取圖像大小?,curl仍會首先下載文件。 –

+0

我想知道是否有一個由curl強加的默認最大限制。不想嗆磁盤,如果下載流氓和它是否是可變的,如通過php.ini –

回答

22

我有另一個答案,更好地解決這種情況,離開這裏爲後代。

CURLOPT_WRITEFUNCTION有利於這一點,但CURLOPT_PROGRESSFUNCTION是最好的

// We need progress updates to break the connection mid-way 
curl_setopt($cURL_Handle, CURLOPT_BUFFERSIZE, 128); // more progress info 
curl_setopt($cURL_Handle, CURLOPT_NOPROGRESS, false); 
curl_setopt($cURL_Handle, CURLOPT_PROGRESSFUNCTION, function(
    $DownloadSize, $Downloaded, $UploadSize, $Uploaded 
){ 
    // If $Downloaded exceeds 1KB, returning non-0 breaks the connection! 
    return ($Downloaded > (1 * 1024)) ? 1 : 0; 
}); 

請記住,即使PHP.net states^CURLOPT_PROGRESSFUNCTION

回調接受五個參數

我的本地測試功能都僅四(4)參數作爲1日(手柄)不存在。

+0

經歷了php.net頁面,並找到了類似的代碼。只是加起來 '//小緩衝區更多進度信息/回調 curl_setopt($ this - > _ Handle,CURLOPT_BUFFERSIZE,128);' –

+0

@SojanVJose對!對於你所需要的,這是最好的方法。在此處添加了示例代碼中提到的選項。 – CodeAngry

+1

測試它與各種文件,並正常工作。切換到答案,因爲這個代碼是更有用的.. –

3

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

<?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,然後當你獲得比你想要的數據更多的數據時,就會在流中調用它。如果禁用了allow_url_fopen,您也可以使用傳輸流(使用fsockopen打開流,而不是fopen並手動發送標題)。

+0

我想知道的是,是否有東西控制全局,每個PHP捲曲從服務器下載。像upload_max_filesize。 codeangry回答這個問題。謝謝:) –

+0

謝謝!!!這是唯一的答案,爲我工作 – rikkitikkitumbo

2

有。我認爲這是PHP的內存限制。由於下載是在內存中完成...

CURLOPT_FILE and CURLOPT_WRITEHEADER^是你的朋友,因爲他們讓你重新路由cURL下載到流。這允許您創建tmpfile()臨時流stream_get_meta_data()爲您提供文件路徑)並下載到它們。直接下載到驅動器會提升內存限制。

下載完成後,您可以閱讀這些文件並按照自己的意願進行操作。

+0

雖然我想要做的只是相反,PHP內存限制回答我原來的問題。爲了安全起見,我希望限制服務器上curl請求的最大下載大小。 希望可以使用與upload_max_filesize類似的獨佔曲線。 –

+1

@SojanVJose使用@ DrZIZO對'CURLOPT_WRITEFUNCTION'的建議。但要確保你需要設置的限制不是太大。沒有辦法做到這一點,但如果你使用'CURLOPT_WRITEFUNCTION'並且繼續附加緩衝區直到達到限制,就可以完成。 – CodeAngry

+1

進入@ drzizo的代碼。似乎更容易實施,而且這種情況處理的限制不是太大。 –