PHP cURL とローリング cURL 同時実行メソッドの比較_PHP チュートリアル
Jul 13, 2016 am 10:25 AM
実際のプロジェクトや独自のガジェット (ニュース集約、商品価格監視、価格比較など) の作成プロセスでは、URL キューを処理する必要がある場合、通常、サードパーティの Web サイトまたは API インターフェイスからデータを取得する必要があります。パフォーマンスを向上させるために、cURL が提供する関数のcurl_multi_* ファミリを使用して、単純な同時実行を実装できます。
この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います。
1. 古典的な cURL 同時実行メカニズムとその既存の問題
古典的な cURL 実装メカニズムは、次のようなオンラインで簡単に見つけることができます。 PHPオンラインマニュアルの実装方法:
function
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 キューが短い場合、このアイドルと無駄は許容されます。
2. 改善されたローリング cURL 同時実行方式
慎重に分析すると、古典的な cURL 同時実行を最適化する余地があることが簡単にわかります。この方法では、処理やその他の作業を開始する前に最も遅いインターフェイスが戻るのを待つのではなく、特定の URL リクエストが完了したらできるだけ早く処理し、処理中に他の URL が戻るのを待ちます。これにより、CPU のアイドル状態や無駄を回避できます。早速、具体的な実装を示します:
機能
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);
戻る
$レスポンス;
}
3. 2 つの公開パフォーマンスは、LINUX ホスト上で実行され、テスト時に使用される前後のパフォーマンスと比較して公開されます。 http://a.com/item.htm?id=14392877692
http:/a.com/item.htm?id=16231676302http://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 の方が若干優れていますが、パフォーマンス向上の効果は明らかではありません。


人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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