2012-02-28 26 views
0

我試圖找到一種方法,只能快速訪問文件,然後立即斷開連接。退出cURL提取

所以我決定使用cURL,因爲它是我最快的選擇。但我無法弄清楚我應該如何「斷開」cURL。

通過下面的代碼,Apache的訪問日誌說我嘗試訪問的文件確實被訪問過,但是我對此感覺有點不安,因爲當我剛剛運行while循環而沒有突破它時,它只是保持循環。當cURL完成讀取文件時,循環是否應該停止?還是我只是傻了;是不斷重啓的循環?

<?php 
$Resource = curl_init(); 
curl_setopt($Resource, CURLOPT_URL, '...'); 
curl_setopt($Resource, CURLOPT_HEADER, 0); 
curl_setopt($Resource, CURLOPT_USERAGENT, '...'); 
while(curl_exec($Resource)){ 
    break; 
} 
curl_close($Resource); 
?> 

我嘗試設置CURLOPT_CONNECTTIMEOUT_MS/CURLOPT_CONNECTTIMEOUT選項,以非常小的值,但它並沒有在這種情況下幫助。

有沒有一個更「適當」的方式來做到這一點?

+0

「快速訪問」是什麼意思?只讀幾個字節?或者只是檢查它是否存在? – raina77ow 2012-02-28 23:50:18

+0

「只讀幾個字節」,我想。 – user966939 2012-02-28 23:52:10

+0

請在這裏看看,如果它適合:http://stackoverflow.com/q/985455/367456 – hakre 2012-02-29 00:01:48

回答

1

這種說法是superflous:

while(curl_exec($Resource)){ 
    break; 
} 

而是不斷的返回值以供將來參考:

$result = curl_exec($Resource); 

while圈沒有幫助任何東西。所以,現在到你的問題:你可以告訴curl它應該只從身體的一些字節,然後退出。這可以通過減少CURLOPT_BUFFERSIZE到一個很小的值,並通過使用一個回調函數來告訴捲曲實現,應立即停止:

$withCallback = array(
    CURLOPT_BUFFERSIZE  => 20, # ~ value of bytes you'd like to get 
    CURLOPT_WRITEFUNCTION => function($handle, $data) { 
     echo "WRITE: (", strlen($data), ") $data\n"; 
     return 0; 
    }, 
); 

$handle = curl_init("http://stackoverflow.com/"); 
curl_setopt_array($handle, $withCallback); 
curl_exec($handle); 
curl_close($handle); 

輸出:

WRITE: (10) <!DOCTYPE 

另一種方法是做一個HEAD請求使用CURLOPT_NOBODY這將永遠不會獲取正文。但它不是GET請求。

連接超時設置大約需要多長時間,直到連接超時。連接是直到服務器接受來自curl的輸入並且curl開始知道服務器所做的事情的階段。這與捲曲從服務器獲取數據時的階段無關,即

CURLOPT_TIMEOUT允許cURL函數執行的最大秒數。

您可以在PHP手冊中找到一長串可用選項:curl_setopt­Docs

+0

請注意,我沒有設置'CURLOPT_TIMEOUT'的值,它是'CURLOPT_CONNECTTIMEOUT_MS'和'CURLOPT_CONNECTTIMEOUT'。 – user966939 2012-02-29 00:26:10

+0

我知道,這就是我指出的原因。您可能希望將其設置爲2或3秒以不再等待讀取。 [請參閱CURLOPT_CONNECTTIMEOUT和CURLOPT_TIMEOUT的區別是什麼? (Quora的)](HTTP://www.quora。COM/PHP /最優價格的差-CURLOPT_CONNECTTIMEOUT和 - CURLOPT_TIMEOUT間)。 – hakre 2012-02-29 00:34:08

1

也許這可能有幫助嗎?

$GLOBALS["dataread"] = 0; 
define("MAX_DATA", 3000); // how many bytes should be read? 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://www.php.net/"); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, "handlewrite"); 
curl_exec($ch); 
curl_close($ch); 

function handlewrite($ch, $data) 
{ 
    $GLOBALS["dataread"] += strlen($data); 
    echo "READ " . strlen($data) . " bytes\n"; 
    if ($GLOBALS["dataread"] > MAX_DATA) { 
     return 0; 
    } 
    return strlen($data); 
}