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

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

Jul 13, 2016 am 10:25 AM
curl php

実際のプロジェクトや独自のガジェット (ニュース集約、商品価格監視、価格比較など) の作成プロセスでは、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('/

(.+)</h3>/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 までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

CakePHP の日付と時刻

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

CakePHP プロジェクトの構成

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

CakePHP ファイルのアップロード

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

CakePHP ルーティング

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP について話し合う

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP クイックガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法

See all articles