5

リストから単語に関するリンクを検索したい。だから私はスクリプトを作っています:

//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ました。しかし、スクリプトの何が問題なのかわかりません。

実際、私の問題は、実行中にスクリプトが突然停止することです。

4

1 に答える 1

5

CURLOPT_LOW_SPEED_TIMEと一緒にオプションを試してください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);

これにより、特定のタイムアウトでダウンロードレートが特定のしきい値を下回った場合に、低速接続またはデッド接続でカールが「ハング」するのを防ぐことができます。タイムアウトに達したら、再試行するか、URLをスキップできます。

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

「動作を停止する」にはいくつかの理由があります。最も単純なのは、リモートサーバーがTCPFINを送信せずに応答中にクラッシュしたことです。(私はこれを野生で見ました)。したがって、基盤となるTCP接続は閉じられず、curlは残りのバイトを(永久に)待機します。

また、接続が確立された後の転送中にポートをブロックするファイアウォールルールが原因である可能性があります。それほど可能性は低いですが、野生でも見られます。

私が想像できるもう1つの理由は、リモートサーバーが間違った「Content-Length」HTTPヘッダーを計算することです。HTTP / 1.1の「Connection:keep-alive」とともに、これにより、送信されない残りのバイトを待機している間、curlが「ハング」する可能性があります。これを防ぐには、ヘッダー'Connection:close'を明示的に使用する必要があります。これは次のように実行できます。

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

ただし、私の提案は、スクリプトがハングしないようにするための単なる回避策です。curlがハングする理由を理解したい場合は、ネットワークトラフィックを追跡する必要があります。Wiresharkを使用できます。

于 2012-12-29T15:22:45.143 に答える