実際のプロジェクトや独自のガジェット (ニュース集約、商品価格監視、価格比較など) の作成プロセスでは、URL キューを処理する必要がある場合、通常、サードパーティの Web サイトまたは API インターフェイスからデータを取得する必要があります。パフォーマンスを向上させるために、cURL が提供する関数のcurl_multi_* ファミリを使用して、単純な同時実行を実装できます。
この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います。
1. 古典的な cURL 同時実行メカニズムとその既存の問題
古典的な cURL 実装メカニズムは、次のようなオンラインで簡単に見つけることができます。 PHPオンラインマニュアルの実装方法:
classic_curl($urls,
$delay)
{
$キュー
=curl_multi_init();
$マップ
= 配列();
foreach
($urls
$url として)
{
cURL リソースを作成します
=curl_init();
//
URL とその他の適切なオプションを設定します
CURLOPT_URL, $url);
curl_setopt($ch,
CURLOPT_TIMEOUT, 1);
CURLOPT_RETURNTRANSFER, 1);
CURLOPT_HEADER, 0);
CURLOPT_NOSIGNAL, true);
//
//
$ch);
= $ch;
$アクティブ
= null;
//
ハンドルを実行します
{
$mrc
=curl_multi_exec($queue,
$active);
ながら
== 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]
$delay);
curl_multi_remove_handle($queue,
curl_close($ch);
}
curl_multi_close($queue);
戻る
$レスポンス;
}
まず、すべての URL を同時実行キューにプッシュし、次に同時実行プロセスを実行し、すべてのリクエストが受信されるのを待ち、データ解析などの後続の処理を実行します。実際の処理プロセスでは、ネットワーク送信の影響を受けて、一部の URL が実行されます。コンテンツは他の URL よりも前に返されますが、従来の cURL 同時実行では、処理を開始する前に最も遅い URL が返されるまで待機する必要があります。URL キューが短い場合、このアイドルと無駄は許容されます。
rolling_curl($urls,
$delay)
{
$キュー
=curl_multi_init();
$map
= 配列();
foreach
($urls
$url として)
{
=curl_init();
curl_setopt($ch,
CURLOPT_URL, $url);
CURLOPT_TIMEOUT, 1);
CURLOPT_RETURNTRANSFER, 1);
CURLOPT_HEADER, 0);
CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue,
$ch);
$ch]
= $url;
$responses
= 配列();
やります
{
しながら
(($コード
=curl_multi_exec($queue,
$active))
== CURLM_CALL_MULTI_PERFORM) ;
もし
($コード
!= CURLM_OK) { ブレーク;
}
//
リクエストが完了しました -- どのリクエストかを調べてください
($完了
=curl_multi_info_read($queue))
{
//
リクエストで返された情報とコンテンツを取得します
=curl_getinfo($done['ハンドル']);
$error
=curl_error($done['ハンドル']);
$結果
= callback(curl_multi_getcontent($done['handle']),
$delay);
$done['handle']]]
= Compact('情報',
'エラー',
'結果');
//
先ほど完成したカールハンドルを削除します
$done['handle']);
}
//
入力/出力のデータをブロックします。エラー処理はcurl_multi_execによって行われます
($アクティブ
> 0){
curl_multi_select($queue,
0.5);
}
ながら
curl_multi_close($queue);
戻る
$レスポンス;
}
要说明下实誌設定の原文および性能试結果の格式: 证結果の可靠、每組验反復 20 回、一次验中、给定同じのインターフェース URL セット、個別にクラシック (典典を指した送信機制) とローリング (変更後の送信機制を指したもの) の 2 つの送信機制の消費時間 (秒は単位)、消費時間短縮者出力 (勝者)、計算省の時間(Excellence、秒は単位)と性能向上率(Excel. %)。 限りなく真の要求を実現するために、結果を返す処理においては、唯一の正しい表形式の一致のみが行われ、他の操作は実行されません。 さらに、結果処理がパフォーマンスに対する比較結果に及ぼす影響を確認するために、usleep モジュールの比較に使用するデータ処理 (文書の抽出、書き込み、データベースなど) を使用することもできます。会話中に使用したフィードバック関数である:
复制代価
代価如下:
コールバック($data,
$遅延)
{
preg_match_all('/
usleep($delay);
戻る
compact('データ',
'一致');
}