ローリング cURL: PHP 同時実行のベスト プラクティス
実際のプロジェクトや独自のガジェット (ニュース集計、商品価格監視、価格比較など) を作成するプロセスでは、通常、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/
を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

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

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

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

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

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

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

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