ホームページ php教程 php手册 ローリング cURL: PHP 同時実行のベスト プラクティス

ローリング cURL: PHP 同時実行のベスト プラクティス

Jun 21, 2016 am 08:51 AM
curl multi url

実際のプロジェクトや独自のガジェット (ニュース集計、商品価格監視、価格比較など) を作成するプロセスでは、通常、URL キューを処理する必要がある場合、サードパーティの Web サイトまたは API インターフェイスからデータを取得する必要があります。パフォーマンスを向上させるために、cURL が提供する関数のcurl_multi_* ファミリを使用して、単純な同時実行性を実装できます。

この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンス比較を行います。

1. 古典的な cURL 同時実行メカニズムとその既存の問題

古典的な cURL 実装メカニズムはオンラインで簡単に見つけることができます。たとえば、PHP オンライン マニュアルの次の実装方法を参照してください。

関数 classic_curl($urls, $lay) { $queue =curl_multi_init();
$map = array();

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;
}

$active = null;

// ハンドルを実行します
{
を実行します $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) {
{
を実行します $mrc =curl_multi_exec($queue, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}

$responses = array();
foreach ($map as $url=>$ch) {
$responses[$url] = callback(curl_multi_getcontent($ch), $lay);
curl_multi_remove_handle($queue, $ch);
curl_close($ch);
}

curl_multi_close($queue);
$responses を返します;
}

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

2. ローリング cURL 同時実行方式の改善

慎重に分析した結果、従来の cURL 同時実行性を最適化する余地がまだあることがわかります。最適化方法は、URL リクエストの完了後にできるだけ早く処理し、処理中に他の URL が返されるのを待つことです。最も遅いインターフェイスを待つのではなく、CPU のアイドル状態や無駄を避けるために、処理やその他の作業を開始します。

関数 rolling_curl($urls, $delay) { $queue =curl_multi_init();
$map = array();

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 = array();
{
を実行します while (($code =curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ;

if ($code != CURLM_OK) { ブレーク }

// リクエストが完了しました -- どのリクエストかを調べてください
while ($done =curl_multi_info_read($queue)) {

// リクエストで返された情報とコンテンツを取得します
$info =curl_getinfo($done['handle']);
$error =curl_error($done['handle']);
$results = callback(curl_multi_getcontent($done['handle']), $lay);
$responses[$map[(string) $done['handle']]] = Compact('info', 'error', 'results');

// 完了したばかりのカール ハンドルを削除します
curl_multi_remove_handle($queue, $done['handle']);
curl_close($done['ハンドル']);
}

// 出力データのブロックは、curl_multi_exec
によって行われます。 if ($active > 0) {
curl_multi_select($queue, 0.5);
}

} while ($active);

curl_multi_close($queue);
$responses を返します;
}

3. 2 つの同時実装のパフォーマンス比較

改善前後の性能比較テストはLINUXホスト上で実施しました。テスト時に使用した同時キューは以下のとおりです。

http://item.taobao.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.taobao.com/item.htm?id=16551116403

http://item.taobao.com/item.htm?id=14088310973

実験計画の原理とパフォーマンス テスト結果の形式を簡単に説明します。結果の信頼性を確保するために、1 回の実験で各セットの実験が 20 回繰り返され、同じインターフェイス URL セットが与えられました。古典的な同時実行メカニズム) とローリング (改良された同時実行メカニズムを参照) は、2 つの同時実行メカニズムのうち時間 (秒単位) がかかるものとして個別に測定され、時間が短い方が勝ち (勝者)、節約された時間を計算します。 Excellence (秒単位) とパフォーマンス改善率 (Excel. %) 実験をシンプルに保ちながら、実際のリクエストにできるだけ近づけるために、返された結果に対して単純な正規表現のマッチングのみを実行し、他の複雑な処理は実行しませんでした。さらに、結果処理のコールバックを決定するために、パフォーマンス比較テストの結果に影響を与えるために、usleep を使用して、実際のより責任のあるデータ処理ロジック (抽出、単語の分割、ファイルやデータベースへの書き込みなど) をシミュレートできます。 .)。

パフォーマンス テストで使用されるコールバック関数は次のとおりです:

関数コールバック($data, $lay) {
preg_match_all('/

(.+)

/iU', $data, $matches);
usleep($delay);
return Compact('data', 'matches');
}

データ処理コールバックに遅延がない場合: Rolling Curl の方が若干優れていますが、パフォーマンス向上効果は明ら​​かではありません。

------------------------------------------------------------------------------------------------
Delay: 0 micro seconds, equals to 0 milli seconds
------------------------------------------------------------------------------------------------
Counter         Classic         Rolling         Winner          Excellence      Excel. %
------------------------------------------------------------------------------------------------
1               0.1193          0.0390          Rolling         0.0803          67.31%
2               0.0556          0.0477          Rolling         0.0079          14.21%
3               0.0461          0.0588          Classic         -0.0127         -21.6%
4               0.0464          0.0385          Rolling         0.0079          17.03%
5               0.0534          0.0448          Rolling         0.0086          16.1%
6               0.0540          0.0714          Classic         -0.0174         -24.37%
7               0.0386          0.0416          Classic         -0.0030         -7.21%
8               0.0357          0.0398          Classic         -0.0041         -10.3%
9               0.0437          0.0442          Classic         -0.0005         -1.13%
10              0.0319          0.0348          Classic         -0.0029         -8.33%
11              0.0529          0.0430          Rolling         0.0099          18.71%
12              0.0503          0.0581          Classic         -0.0078         -13.43%
13              0.0344          0.0225          Rolling         0.0119          34.59%
14              0.0397          0.0643          Classic         -0.0246         -38.26%
15              0.0368          0.0489          Classic         -0.0121         -24.74%
16              0.0502          0.0394          Rolling         0.0108          21.51%
17              0.0592          0.0383          Rolling         0.0209          35.3%
18              0.0302          0.0285          Rolling         0.0017          5.63%
19              0.0248          0.0553          Classic         -0.0305         -55.15%
20              0.0137          0.0131          Rolling         0.0006          4.38%
------------------------------------------------------------------------------------------------
Average         0.0458          0.0436          Rolling         0.0022          4.8%
------------------------------------------------------------------------------------------------
Summary: Classic wins 10 times, while Rolling wins 10 times
ログイン後にコピー

データ処理コールバック遅延 5 ミリ秒: Rolling Curl が勝利し、パフォーマンスが約 40% 向上しました。

<span style="font-size: 14px; "><span style="font-family: Arial, Helvetica, sans-serif; ">------------------------------------------------------------------------------------------------
Delay: 5000 micro seconds, equals to 5 milli seconds
------------------------------------------------------------------------------------------------
Counter         Classic         Rolling         Winner          Excellence      Excel. %
------------------------------------------------------------------------------------------------
1               0.0658          0.0352          Rolling         0.0306          46.5%
2               0.0728          0.0367          Rolling         0.0361          49.59%
3               0.0732          0.0387          Rolling         0.0345          47.13%
4               0.0783          0.0347          Rolling         0.0436          55.68%
5               0.0658          0.0286          Rolling         0.0372          56.53%
6               0.0687          0.0362          Rolling         0.0325          47.31%
7               0.0787          0.0337          Rolling         0.0450          57.18%
8               0.0676          0.0391          Rolling         0.0285          42.16%
9               0.0668          0.0351          Rolling         0.0317          47.46%
10              0.0603          0.0317          Rolling         0.0286          47.43%
11              0.0714          0.0350          Rolling         0.0364          50.98%
12              0.0627          0.0215          Rolling         0.0412          65.71%
13              0.0617          0.0401          Rolling         0.0216          35.01%
14              0.0721          0.0226          Rolling         0.0495          68.65%
15              0.0701          0.0428          Rolling         0.0273          38.94%
16              0.0674          0.0352          Rolling         0.0322          47.77%
17              0.0452          0.0425          Rolling         0.0027          5.97%
18              0.0596          0.0366          Rolling         0.0230          38.59%
19              0.0679          0.0480          Rolling         0.0199          29.31%
20              0.0657          0.0338          Rolling         0.0319          48.55%
------------------------------------------------------------------------------------------------
Average         0.0671          0.0354          Rolling         0.0317          47.24%
------------------------------------------------------------------------------------------------
Summary: Classic wins 0 times, while Rolling wins 20 times</span></span>
ログイン後にコピー

上記のパフォーマンス比較から、URL キューの同時実行を扱うアプリケーション シナリオでは、同時実行が非常に大きい (1000 以上) 場合、同時キューの最大長を制御できるため、ローリング cURL がより適切な選択肢となるはずです。 、20 など。URL が返されて処理されるたびに、まだリクエストされていない URL がすぐにキューに追加されます。この方法で記述されたコードはより堅牢になり、同時実行数が大きくなりすぎることはありません。詳細な実装については、http://code.google.com/p/rolling-curl/

を参照してください。



このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 PythonでCURLリクエストとPythonリクエストの相互変換を実現する方法 May 03, 2023 pm 12:49 PM

curl と Pythonrequests は両方とも、HTTP リクエストを送信するための強力なツールです。 curl はターミナルから直接リクエストを送信できるコマンドライン ツールですが、Python のリクエスト ライブラリは、Python コードからリクエストを送信するためのよりプログラム的な方法を提供します。 curl を Pythonrequestscurl コマンドに変換するための基本的な構文は次のとおりです。curl[OPTIONS]URLcurl コマンドを Python リクエストに変換する場合、オプションと URL を Python コードに変換する必要があります。これは、curlPOST コマンドの例です:curl-XPOST https://example.com/api

Linux での CURL バージョンの更新に関するチュートリアル! Linux での CURL バージョンの更新に関するチュートリアル! Mar 07, 2024 am 08:30 AM

Linux でカールのバージョンを更新するには、以下の手順に従います。 現在のカールのバージョンを確認します。 まず、現在のシステムにインストールされているカールのバージョンを確認する必要があります。ターミナルを開き、次のコマンドを実行します。curl --version このコマンドは、現在のcurlバージョン情報を表示します。利用可能なcurlのバージョンを確認する:curlを更新する前に、利用可能な最新バージョンを確認する必要があります。 Curl の公式 Web サイト (curl.haxx.se) または関連ソフトウェア ソースにアクセスして、curl の最新バージョンを見つけることができます。 Curl ソース コードをダウンロードする:curl またはブラウザを使用して、選択した CURL バージョンのソース コード ファイル (通常は .tar.gz または .tar.bz2) をダウンロードします。

PHP 関数の紹介 - get_headers(): URL の応答ヘッダー情報を取得します PHP 関数の紹介 - get_headers(): URL の応答ヘッダー情報を取得します Jul 25, 2023 am 09:05 AM

PHP 関数の紹介 - get_headers(): URL の応答ヘッダー情報の取得の概要: PHP 開発では、Web ページまたはリモート リソースの応答ヘッダー情報を取得する必要があることがよくあります。 PHP 関数 get_headers() を使用すると、対象 URL の応答ヘッダー情報を簡単に取得し、配列の形式で返すことができます。この記事では、get_headers() 関数の使用法を紹介し、関連するコード例をいくつか示します。 get_headers() 関数の使用法: get_header

e からの NameResolutionError(self.host, self, e) の理由とその解決方法 e からの NameResolutionError(self.host, self, e) の理由とその解決方法 Mar 01, 2024 pm 01:20 PM

エラーの理由は、urllib3 ライブラリの例外タイプである NameResolutionError(self.host,self,e)frome です。このエラーの理由は、DNS 解決が失敗したこと、つまり、ホスト名または IP アドレスが試みられたことです。解決できるものが見つかりません。これは、入力された URL アドレスが間違っているか、DNS サーバーが一時的に利用できないことが原因である可能性があります。このエラーを解決する方法 このエラーを解決するにはいくつかの方法があります。 入力された URL アドレスが正しいかどうかを確認し、アクセス可能であることを確認します。 DNS サーバーが利用可能であることを確認します。コマンド ラインで「ping」コマンドを使用してみてください。 DNS サーバーが利用可能かどうかをテストします。プロキシの背後にある場合は、ホスト名の代わりに IP アドレスを使用して Web サイトにアクセスしてみてください。

最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 最初から最後まで: PHP 拡張機能 cURL を使用して HTTP リクエストを行う方法 Jul 29, 2023 pm 05:07 PM

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 Jul 08, 2023 pm 09:13 PM

PHP8.1 リリース: 複数リクエストの同時処理のためのcurlの導入 最近、PHPは最新バージョンのPHP8.1を正式にリリースし、重要な機能である複数リクエストの同時処理のためのcurlを導入しました。この新機能により、開発者は複数の HTTP リクエストをより効率的かつ柔軟に処理できるようになり、パフォーマンスとユーザー エクスペリエンスが大幅に向上します。以前のバージョンでは、複数のリクエストを処理するには、多くの場合、複数の CURL リソースを作成し、ループを使用してデータをそれぞれ送受信する必要がありました。この方法でも目的は達成できますが、

いくつかの手順で Steam ID を取得するにはどうすればよいですか? いくつかの手順で Steam ID を取得するにはどうすればよいですか? May 08, 2023 pm 11:43 PM

現在、ゲームを愛する多くの Windows ユーザーが Steam クライアントにアクセスし、優れたゲームを検索、ダウンロードしてプレイすることができます。ただし、多くのユーザーのプロフィールがまったく同じ名前である可能性があるため、プロフィールを見つけたり、Steam プロフィールを他のサードパーティのアカウントにリンクしたり、Steam フォーラムに参加してコンテンツを共有したりすることさえ困難になります。プロファイルには一意の 17 桁の ID が割り当てられます。ID は変更されず、ユーザーがいつでも変更することはできませんが、ユーザー名またはカスタム URL は変更できます。いずれにせよ、一部のユーザーは自分の Steamid を知らないため、これを知ることが重要です。アカウントの Steamid を見つける方法がわからなくても、慌てる必要はありません。記事上で

htmlとurlの違いは何ですか htmlとurlの違いは何ですか Mar 06, 2024 pm 03:06 PM

相違点: 1. 定義が異なります。URL はユニフォーム リソース ロケーターであり、HTML はハイパーテキスト マークアップ言語です。 2. HTML には多数の URL を含めることができますが、URL 内に存在できる HTML ページは 1 つだけです。 3. HTML は is を指します。 Web ページ、url は Web サイトのアドレスを指します。

See all articles