3

そのため、約 3000 個のリンクを処理しています。curl_multi を使用してプロセスを高速化しています。一度に 20 の単純なプロセスを使用し、20 個すべてが終了するのを待って、さらに 20 個の方法を処理しましたが、特にこれらの 20 個のリンクの 1 つがダウンロードに永遠にかかる場合は、これは非効率的であることがわかっています。そのため、その URL からコンテンツを取得したらすぐにハンドルを追加/削除して、3000 個のリンクすべてを通過するループを作成する方法を知る必要があります。

私はこれらの基礎のいくつかを使用しています:

define('RUNATONCE', 20); // Links to process at a time

// My URL holding multi-dimensional array:
// This first dimension is about 1000 and the second dimension is 3
$allurls[0][0];

次のことができる必要があります。

1)ハンドルがいつ完了したかを確認し、ハンドルが属する多次元配列のURLを確認します

2) そのハンドルの内容を取得し、そのハンドルの内容が の一部であるかどうかに基づいてプロセスを割り当てます$allurls[0][0],$allurls[0][1]($allurls[0][2]それらのそれぞれに異なるプロセス)

$allurls3)すべてのリンクが処理されるまで、そのハンドルを削除し、別の URL を追加します。

4) 一定時間以上、たとえば 2 分以上かかった URL に対して手動でタイムアウトを処理します ( CURLOPT_CONNECTTIMEOUT&CURLOPT_TIMEOUTが curl_multi 環境で適切に機能しないため) (または、少なくともhttp: //curl.haxx.se/mail/curlphp-2008-06/0006.html ))、しかし、$allurlsその URL がタイムアウトしたかどうかを知る必要もあります...

これはちょっとした作業のように思えますが、これを知っている人にとっては、それほど多くの作業ではないはずです...具体的な方法が本当にわかりません...ありがとう。

4

1 に答える 1

-1

特定の URL を検証する必要がある同様の状況がありました。私が見つけた 2 つの解決策は、最初にpcntlがインストールされている場合は、それを使用して PHP フォークを新しいプロセスにすることでした。サーバーにインストールされている場合) AJAX を使用して、URL を検証する PHP ページを要求します。タイムアウトは 30 秒に設定しているので、時間がかかっても問題ありません。

于 2011-08-09T01:31:45.343 に答える