2012-12-29 229 views
3

我想從列表中搜索一些關於單詞的鏈接。 所以我正在腳本:CURL停止工作

//html code here. 
<? 
if (array_key_exists('form_action', $_POST)){ 
$pel=$_POST['url']; 
$toplist=file_get_contents($pel); 
$listgrabbing=explode("\r\n",$toplist); 
foreach($listgrabbing as $item) 
{  

$useragent="Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar; .NET CLR 2.0.50727)"; 
$urlto=$item; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $urlto); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "COOKIE.txt"); 
curl_setopt($ch, CURLOPT_COOKIEFILE, "COOKIE.txt"); 
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,10); 
$buffer = curl_exec($ch); 
$po = strpos($buffer,"article"); 
if ($po===false) 
{ 
echo ($item."---Word didn't found!"); 
echo "<br>"; 
} 
else { 
echo ($item."---Word Found!"); 
echo "<br>"; 
} 
} 
} 
?> 

它工作正常。但有時腳本突然停止工作。我不知道爲什麼。 可能會進入一個沒有響應的網站。但爲此我使用了CURLOPT_CONNECTTIMEOUT。但我沒有發現腳本中有什麼問題。

其實我的問題是,腳本在運行時突然停止。

+1

嘗試'if($ buffer === false){echo curl_error($ ch); }' –

回答

2

CURLOPT_LOW_SPEED_LIMIT

// the download speed must be at least 1 byte per second 
curl_setopt(CURLOPT_LOW_SPEED_LIMIT, 1); 
// if the download speed is below 1 byte per second for 
// more than 30 seconds curl will give up 
curl_setopt(CURLOPT_LOW_SPEED_TIME, 30); 

這嘗試的選項CURLOPT_LOW_SPEED_TIME一起將防止捲曲從慢或死連接「掛」如果給定超時的下載速率低於給定的閾值。當超時達到時,您可以重試或跳過網址:

// skips the url if errors on download 
$buffer = curl_exec($ch); 
if ($buffer === FALSE) { 
    echo curl_error($ch); 
    continue; 
} 

'停止工作'可以有幾個原因。最簡單的是,遠程服務器在響應期間不會發送TCP FIN。 (我在野外見過這個)。所以底層的TCP連接不會被關閉,curl會永遠等待剩餘的字節。

另外一個防火牆規則,在連接建立後傳輸過程中阻塞端口可能是原因。不太可能,但也可以在野外看到。

我能想象的另一個原因是,遠程服務器計算錯誤的「Content-Length」HTTP標頭。與HTTP/1.1的「連接:保持活動」一起,這可能會導致curl'掛起',同時等待永遠不會發送的字節。爲了防止出現這種情況,您應該明確使用標題'Connection:close'。這可以做到如下:

curl_setopt(CURLOPT_HTTPHEADER, array('Connection: close')); 

但是我的建議只是解決方法,以防止您的腳本掛起。如果您想了解爲什麼 curl掛起,您必須跟蹤網絡流量。你可以使用Wireshark。

+0

現在還在停止工作。但是你的建議很快就會得到結果。 –

+0

好的。知道問題是什麼會很有趣? (如果你可以簡單地說) – hek2mgl

+0

其實我不能跟隨錯誤。我意思是爲什麼執行停止。 但是,問題是它只是突然停止工作。 –