PHP Curl マルチスレッド実装の原則と例の詳細な説明_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:43:46
オリジナル
916 人が閲覧しました

仕事で何かを処理するために Curl マルチスレッドを使用する必要があることが多いため、Curl マルチスレッドについて徹底的に調査するしかありません。Curl マルチスレッドの例と原理を紹介します。

多くの人が、PHP マニュアルでは不明瞭な、curl_multi 関数ファミリーについて頭を悩ませていると思います。それらのドキュメントはほとんどなく、示されている例は非常に単純なので、そこから学ぶことはできません。しかし、私も多くの Web ページを検索しました。完全なアプリケーション例を見たことがありません。

curl_multi_add_handle
カールマルチクローズ
カールマルチ実行
カール_マルチ_ゲットコンテンツ
カール_マルチ_情報_読み取り
カールマルチ初期化
カールマルチ削除ハンドル
カールマルチセレクト

一般的に、これらの関数の使用を考えるとき、その目的は明らかに、複数の URL を 1 つずつリクエストするのではなく、同時にリクエストすることである必要があります。それ以外の場合は、curl_exec を自分でループして調整することをお勧めします。

手順は次のように要約されます:

ステップ 1:curl_multi_init を呼び出す
ステップ2: ループ内でcurl_multi_add_handleを呼び出す
この手順で注意する必要があるのは、curl_multi_add_handle の 2 番目のパラメータがcurl_init のサブハンドルであるということです。
ステップ 3: 引き続き、curl_multi_exec の呼び出しを行います
ステップ4: 必要に応じてループ内でcurl_multi_getcontentを呼び出し、結果を取得します
ステップ 5: 単語ハンドルごとにcurl_multi_remove_handleを呼び出し、curl_closeを呼び出します
ステップ 6:curl_multi_close を呼び出す
以下は PHP マニュアルの例です:

コードは次のとおりです コードをコピー

// cURL リソースのペアを作成します

$ch1 =curl_init();

$ch2 =curl_init();

//URL と対応するオプションを設定します

curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");

curl_setopt($ch1, CURLOPT_HEADER, 0);

curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");

curl_setopt($ch2, CURLOPT_HEADER, 0);

//バッチ cURL ハンドルを作成する

$mh =curl_multi_init();

// ハンドルを 2 つ追加します

curl_multi_add_handle($mh,$ch1);

curl_multi_add_handle($mh,$ch2);

$アクティブ = null;

// バッチハンドルを実行する

する{

$mrc =curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {

if (curl_multi_select($mh) != -1) {

する

$mrc =curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

//すべてのハンドルを閉じます

curl_multi_remove_handle($mh, $ch1);

curl_multi_remove_handle($mh, $ch2);

curl_multi_close($mh);

?>

全体の使用プロセスはほぼ次のとおりですが、この単純なコードには致命的な弱点があります。つまり、do ループで URL リクエスト全体が無限ループになり、CPU が 100% を占有してしまう可能性があります。

ここでそれを改善しましょう。ここではほとんどドキュメントのない関数curl_multi_selectを使用する必要がありますが、Cのcurlライブラリにはselectの命令がありますが、PHPのインターフェイスと使用法はCのものとは確かに異なります。

上記の do 段落を次のように変更します。

各リクエストのタイムアウトを制御します。curl_multi_add_handle の前に、curl_setopt を通じて実行します。 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
コードは次のとおりです コードをコピー

する{

$mrc=curl_multi_exec($mh,$active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active および $mrc == CURLM_OK) {

_

(} 一方 ($ Mrc == CURLM_CALL_MULTI_PERFORM);

}

$active は false になる前にすべての URL データが受信されるまで待機する必要があるため、ここでは、curl_multi_exec の戻り値を使用してデータが存在するかどうかを判断します。データが存在する場合は、curl_multi_exec が継続的に呼び出されます。新しいデータが到着するとすぐに起動して実行を続行できます。この場合の利点は、CPU を不必要に消費しないことです。

また: 時々遭遇するかもしれないいくつかの詳細があります:

タイムアウトまたはその他のエラーがあるかどうかを判断するには、curl_multi_getcontent の前に、curl_error($conn[$i]); を使用します。

このカテゴリの特徴:


動作は非常に安定しています。

同時実行数を設定すると、常にこの同時実行数で作業することになります。コールバック関数を通じてタスクを追加した場合でも、影響を受けません。

CPU 使用率は非常に低く、CPU のほとんどはユーザーのコールバック関数で消費されます。 メモリ使用率が高く、タスクの数が多くなります (15W のタスクは 256M を超えるメモリを占有します)。コールバック関数を使用してタスクを追加でき、その数はカスタマイズされます。 最大帯域幅を占有することができます。

複数の異なるアドレスからデータを収集する必要があるタスクなどの連鎖タスクは、コールバックを使用して 1 回の実行で完了できます。

CURLエラーは複数回試行でき、回数はカスタマイズ可能(同時実行数が多いため最初はCURLエラーが発生しやすく、ネットワーク状況や相手サーバーの安定性によってもCURLエラーが発生する場合があります) )。
コールバック関数は非常に柔軟で、複数の種類のタスクを同時に実行できます (たとえば、ファイルのダウンロード、Web ページの巡回、および 404 の分析を 1 つの PHP プロセスで同時に実行できます)。 404 のチェック、リダイレクトの最後の URL の取得など、タスク タイプをカスタマイズするのは非常に簡単です。 キャッシュを設定して製品の完全性を試すことができます。

短所:


マルチコアCPUを最大限に活用できない(問題を解決するために複数のプロセスを開くことができますが、タスク分割などのロジックを自分で処理する必要があります)。
テスト後の最大同時実行数は 500 (または 512?) で、最大同時実行数を超えると常に失敗します。
現在のところレジューム機能はありません。
現在のタスクはアトミックであるため、大きなファイルをいくつかの部分に分割し、個別のスレッドを開いてダウンロードすることはできません。



www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/633144.html技術記事仕事で何かを処理するために Curl マルチスレッドを使用する必要があることがよくあるため、Curl マルチスレッドについて詳しく調査するしかありません...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート