この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います
1. 古典的な cURL 同時実行メカニズムとその既存の問題
古典的な cURL 実装メカニズムは、オンラインで簡単に見つけることができます。 PHPオンラインマニュアルの以下の実装方法:
コードをコピーします コードは次のとおりです:
function classic_curl($urls, $lay) {
$queue =curl_multi_init();
$map = array();
foreach ($urls as $url) {
// cURL リソースを作成
$ch =curl_init();
// URL とその他の適切なオプションを設定
curl_setopt($ch, CURLOPT_URL, $url) ;
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
//ハンドルを追加
curl_multi_add_handle ($queue, $ch);
$map[$url] = $ch;
// ハンドルを実行
do {
$mrc =curl_multi_exec($queue) , $active) ;
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active > 0 && $mrc == CURLM_OK) {
if (curl_multi_select($queue, 0.5) != -1) {
do {
$ mrc =curl_multi_exec($queue, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM)
}
$responses = array(); >$ch) {
$responses[$url] = callback(curl_multi_getcontent($ch), $delay);
curl_close($ch); queue);
return $response;
}
まず、すべての URL を並行キューにプッシュし、次に並行プロセスを実行し、すべてのリクエストが受信されるのを待ち、実際の処理プロセスでデータ解析などの後続の処理を実行します。ネットワーク送信の影響を受け、一部の URL のコンテンツは他の URL よりも先に返されますが、従来の cURL 同時実行では、処理を開始する前に最も遅い URL が返されるまで待機する必要があります。URL キューが非常に短い場合、待機することにより CPU がアイドル状態になり、無駄が生じます。このアイドル状態と無駄はまだ許容範囲内ですが、キューが非常に長い場合、この種の待機と無駄は許容できなくなります
2. ローリング cURL 同時実行方式の改善
することは難しくありません。慎重に分析した結果、従来の cURL 同時実行には最適化があることがわかりました。その最適化方法は、特定の URL リクエストが完了した後、できるだけ早く処理し、最も遅い URL を待つのではなく、処理中に他の URL が返されるのを待つことです。処理やその他の作業を開始する前に返すインターフェースを使用して、CPU アイドル状態と無駄を回避します。 詳しい説明は省略します。
コードをコピーします
コードは次のとおりです。 urls, $delay) {
$queue =curl_multi_init();
$map = array();
foreach ($urls として) {
$ch =curl_init(); $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue, $ch); $map[(string) $ch] = $url; $responses = array();
while (($code =curl_multi_exec($queue, $ active)) == CURLM_CALL_MULTI_PERFORM) ;
if ($code != CURLM_OK) { Break; }
// リクエストが完了しました -- どれかを調べます
while ($done =curl_multi_info_read($queue)) {
// リクエストで返された情報とコンテンツを取得します
$info =curl_getinfo($done['handle']);
$error =curl_error($done['handle']);
$results = callback(curl_multi_getcontent) ($done['ハンドル']), $遅延);
$ 応答[$map[(文字列) $done['ハンドル']]] = コンパクト('情報', 'エラー', '結果');
// 完了したばかりのカールハンドルを削除します
curl_multi_remove_handle($queue, $done['handle']);
curl_close($done['handle']);
}
// データ入力/出力をブロックします。エラー処理は、curl_multi_exec
if ($active > 0) {
curl_multi_select($queue, 0.5);
} while ($active);
return $responses; によって行われます。
3. 2 つの同時実装のパフォーマンス比較
改善前後のパフォーマンス比較テストは、LINUX ホストで実行されました。テスト中に使用された同時キューは次のとおりです。 .com/item.htm ?id=14392877692
http://item.taobao.com/item.htm?id=16231676302
http://item.taobao.com/item.htm?id=17037160462
http:/ /item.taobao.com /item.htm?id=5522416710
http://item.taabao.com/item.htm?id=16551116403
http://item.taovao.com/item.htm?id=14088310973
実験を簡単に説明します パフォーマンス テスト結果の設計原則と形式: 結果の信頼性を確保するために、各セットの実験を 1 回の実験で 20 回繰り返し、同じインターフェイス URL セットを指定し、クラシック (古典的な同時実行メカニズム) とローリング (改良された同時実行メカニズムを指します) 2 つの同時実行メカニズムの消費時間 (秒単位) を計算し、時間が短い方が勝ち (勝者)、節約された時間 (優秀、秒単位) を計算します。実験を単純に保ちながら実際のリクエストにできるだけ近づけるために、返された結果の処理で単純な正規表現マッチングのみを実行し、その他の複雑な処理は実行しませんでした。さらに、結果処理のコールバックを決定するために、パフォーマンス比較テストを実施しました。結果に影響を与えるために、usleep を使用して、実際のより信頼性の高いデータ処理ロジック (抽出、単語の分割、ファイルへの書き込みなど) をシミュレートできます。
パフォーマンス テストで使用されるコールバック関数は次のとおりです:
コードをコピーします コードは次のとおりです:
function callback($data, $delay) {
preg_match_all('/
(.+)
/iU', $data, $matches);
return Compact('data', 'matches');データ処理コールバックには遅延がありません: Rolling Curl の方がわずかに優れていますが、パフォーマンス向上の効果は明らかではありません。
データ処理コールバックは 5 ミリ秒遅延します。Rolling Curl が勝ち、パフォーマンスは約 40% 向上します。上記のパフォーマンス比較では、URL キューの同時処理を行うアプリケーション シナリオでは、同時実行キューの最大長 (1000 以上) を制御することができます。が返されて処理されると、まだリクエストされていない URL がすぐにキューに追加されます。この方法で記述されたコードはより堅牢になり、同時実行数が大きくなりすぎてスタックしたりクラッシュしたりすることはありません。詳しい実装については、http://code.google.com/p/rolling-curl/ を参照してください。
http://www.bkjia.com/PHPjc/325860.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/325860.html
技術記事この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います。 1. 古典的な cURL 同時実行メカニズムとその既存の問題 古典的な cURL 実装メカニズムは、オンラインで簡単に見つけることができます...。