ホームページ  >  記事  >  バックエンド開発  >  PHP cURL とローリング cURL 同時実行メソッドの比較_PHP チュートリアル

PHP cURL とローリング cURL 同時実行メソッドの比較_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:25:421034ブラウズ

実際のプロジェクトや独自のガジェット (ニュース集約、商品価格監視、価格比較など) の作成プロセスでは、URL キューを処理する必要がある場合、通常、サードパーティの Web サイトまたは API インターフェイスからデータを取得する必要があります。パフォーマンスを向上させるために、cURL が提供する関数のcurl_multi_* ファミリを使用して、単純な同時実行を実装できます。
この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います。
1. 古典的な cURL 同時実行メカニズムとその既存の問題
古典的な cURL 実装メカニズムは、次のようなオンラインで簡単に見つけることができます。 PHPオンラインマニュアルの実装方法:

コードをコピー コードは次のとおりです:

function

classic_curl($urls,
$delay)
{

$キュー

=curl_multi_init();

$マップ

= 配列();

foreach

($urls

$url として)
{

//

cURL リソースを作成します

$ch

=curl_init();

//

URL とその他の適切なオプションを設定します

curl_setopt($ch,

CURLOPT_URL, $url);

curl_setopt($ch,

CURLOPT_TIMEOUT, 1);

curl_setopt($ch,

CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch,

CURLOPT_HEADER, 0);

curl_setopt($ch,

CURLOPT_NOSIGNAL, true);

//

//

curl_multi_add_handle($queue,

$ch);

$map[$url]

= $ch;

}

$アクティブ

= null;

//

ハンドルを実行します

やります

{

$mrc

=curl_multi_exec($queue,

$active);

}

ながら

($mrc

== CURLM_CALL_MULTI_PERFORM);

しながら

($アクティブ

> 0 && $mrc

== CURLM_OK) {

もし

(curl_multi_select($queue,

0.5) != -1) {

{

$mrc

=curl_multi_exec($queue,

$active);


}

ながら


($mrc

== CURLM_CALL_MULTI_PERFORM);

}

}

$レスポンス

= 配列();

foreach

($マップ

として

$url=>$ch)

{

$responses[$url]

= callback(curl_multi_getcontent($ch),

$delay);

curl_multi_remove_handle($queue,

$ch);


curl_close($ch);

}

curl_multi_close($queue);

戻る

$レスポンス;

}


まず、すべての URL を同時実行キューにプッシュし、次に同時実行プロセスを実行し、すべてのリクエストが受信されるのを待ち、データ解析などの後続の処理を実行します。実際の処理プロセスでは、ネットワーク送信の影響を受けて、一部の URL が実行されます。コンテンツは他の URL よりも前に返されますが、従来の cURL 同時実行では、処理を開始する前に最も遅い URL が返されるまで待機する必要があります。URL キューが短い場合、このアイドルと無駄は許容されます。


2. 改善されたローリング cURL 同時実行方式
慎重に分析すると、古典的な cURL 同時実行を最適化する余地があることが簡単にわかります。この方法では、処理やその他の作業を開始する前に最も遅いインターフェイスが戻るのを待つのではなく、特定の URL リクエストが完了したらできるだけ早く処理し、処理中に他の URL が戻るのを待ちます。これにより、CPU のアイドル状態や無駄を回避できます。早速、具体的な実装を示します:

コードをコピーします コードは次のとおりです:

機能

rolling_curl($urls,
$delay)
{

$キュー

=curl_multi_init();

$map

= 配列();

foreach

($urls

$url として)
{

$ch

=curl_init();

curl_setopt($ch,

CURLOPT_URL, $url);

curl_setopt($ch,

CURLOPT_TIMEOUT, 1);

curl_setopt($ch,

CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch,

CURLOPT_HEADER, 0);

curl_setopt($ch,

CURLOPT_NOSIGNAL, true);

curl_multi_add_handle($queue,

$ch);

$map[(string)

$ch]
= $url;

}

$responses

= 配列();

やります

{

しながら

(($コード

=curl_multi_exec($queue,

$active))
== CURLM_CALL_MULTI_PERFORM) ;

もし

($コード

!= CURLM_OK) { ブレーク;

}

//

リクエストが完了しました -- どのリクエストかを調べてください

しながら

($完了

=curl_multi_info_read($queue))

{

//

リクエストで返された情報とコンテンツを取得します

$info

=curl_getinfo($done['ハンドル']);

$error

=curl_error($done['ハンドル']);

$結果

= callback(curl_multi_getcontent($done['handle']),

$delay);

$responses[$map[(string)

$done['handle']]]
= Compact('情報',
'エラー',
'結果');

//

先ほど完成したカールハンドルを削除します

curl_multi_remove_handle($queue,

$done['handle']);

curl_close($done['handle']);

}

//

入力/出力のデータをブロックします。エラー処理はcurl_multi_execによって行われます

もし

($アクティブ

> 0){

curl_multi_select($queue,

0.5);

}

}

ながら

($active);

curl_multi_close($queue);

戻る

$レスポンス;

}



3. 2 つの公開パフォーマンスは、LINUX ホスト上で実行され、テスト時に使用される前後のパフォーマンスと比較して公開されます。 http://a.com/item.htm?id=14392877692
http:/a.com/item.htm?id=16231676302
http://a.com/item.htm?id=5522416710http: //a.com/item.htm?id=16551116403

要说明下实誌設定の原文および性能试結果の格式: 证結果の可靠、每組验反復 20 回、一次验中、给定同じのインターフェース URL セット、個別にクラシック (典典を指した送信機制) とローリング (変更後の送信機制を指したもの) の 2 つの送信機制の消費時間 (秒は単位)、消費時間短縮者出力 (勝者)、計算省の時間(Excellence、秒は単位)と性能向上率(Excel. %)。 限りなく真の要求を実現するために、結果を返す処理においては、唯一の正しい表形式の一致のみが行われ、他の操作は実行されません。 さらに、結果処理がパフォーマンスに対する比較結果に及ぼす影響を確認するために、usleep モジュールの比較に使用するデータ処理 (文書の抽出、書き込み、データベースなど) を使用することもできます。会話中に使用したフィードバック関数である:



复制代価

代価如下:


機能

コールバック($data,
$遅延)
{

preg_match_all('/

(.+)

/iU',
$data,
$matches);

usleep($delay);

戻る

compact('データ',
'一致');

}


データ処理コールバックに遅延がない場合: Rolling Curl の方が若干優れていますが、パフォーマンス向上の効果は明ら​​かではありません。
PHP cURL とローリング cURL 同時実行メソッドの比較_PHP チュートリアル

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/824943.html技術記事実際のプロジェクトや独自のガジェット (ニュース集計、商品価格監視、価格比較など) の作成プロセスでは、通常、UR を処理する必要がある場合、サードパーティの Web サイトまたは API インターフェイスからデータを取得する必要があります。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。