2012-12-29 176 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

其实我不能跟随错误。我意思是为什么执行停止。 但是,问题是它只是突然停止工作。 –