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

WBOY
リリース: 2016-07-13 10:25:37
オリジナル
900 人が閲覧しました

Curl マルチスレッドの例と原則を紹介します。私が間違っていたら教えてください
PHP マニュアルでは不明瞭なcurl_multi関数ファミリーについて多くの人が頭を悩ませていると思います。ドキュメントはほとんどなく、与えられた例は非常に単純なのでそこから学ぶ方法はありません。 . 私も多くの Web ページを検索しましたが、完全なアプリケーション例は見つかりませんでした。
curl_multi_add_handle
curl_multi_close
curl_multi_exec
curl_multi_getcontent
curl_multi_info_read
curl_multi_init
curl_multi_remove_handle
curl_multi_select
一般的に、これらの関数の使用を考えるとき、その目的は明らかに複数の 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://www.jb51.net/");
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);

$active = null;
$mrc , $active); $ mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc =curl_multi_exec($mh) , $active) ; ...
curl_multi_close($mh);
?>


全体の使用プロセスは、次のようになります。これは URL リクエスト全体で無限ループとなり、CPU が 100% を占有してしまう可能性があります。
ここでそれを改善しましょう。ここではほとんどドキュメントのない関数curl_multi_selectを使用する必要がありますが、Cのcurlライブラリにはselectの命令がありますが、PHPのインターフェイスと使用法はCのものとは確かに異なります。
上記の do セクションを次のように変更します:


コードをコピーします

コードは次のとおりです:
} while ($mrc == CURLM_CALL_MULTI_PERFORM );
while ($active and $mrc == CURLM_OK) { mrc ==マルチパフォーマンス);

$active は false になる前にすべての URL データが受信されるまで待機する必要があるため、ここでは、curl_multi_exec の戻り値を使用してデータが存在するかどうかを判断します。データが存在する場合は、curl_multi_exec が継続的に呼び出されます。新しいデータが到着するとすぐに起動して実行を続行できます。この場合の利点は、CPU を不必要に消費しないことです。
さらに: 時々発生する可能性のあるいくつかの詳細があります:
各リクエストのタイムアウトを制御します。curl_multi_add_handle の前に、curl_setopt を通じて実行します。
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
タイムアウトしたかどうかを判断します。エラーの場合は、curl_multi_getcontent の前にcurl_error($conn[$i]); を使用します。 このカテゴリの特徴:

動作が非常に安定しています。
同時実行数を設定すると、常にこの同時実行数で作業することになります。コールバック関数を通じてタスクを追加した場合でも、影響を受けません。
CPU 使用率は非常に低く、CPU のほとんどはユーザーのコールバック関数で消費されます。
高いメモリ使用量と多数のタスク (15W のタスクは 256M 以上のメモリを占有します) コールバック関数を使用してタスクを追加でき、その数はカスタマイズされます。
帯域幅を最大限に占有することができます。
複数の異なるアドレスからデータを収集する必要があるタスクなどの連鎖タスクは、コールバックを使用して一度に完了できます。
CURLエラーを複数回試行可能、回数はカスタマイズ可能(同時実行数が多いため最初はCURLエラーが発生しやすく、ネットワーク状況や相手の安定性によってもCURLエラーが発生する可能性があります)サーバ)。
コールバック関数は非常に柔軟で、複数の種類のタスクを同時に実行できます (たとえば、ファイルのダウンロード、Web ページのクローリング、404 の分析を 1 つの PHP プロセスで同時に実行できます)。
404のチェック、リダイレクトの最後のURLの取得など、タスクの種類をカスタマイズするのは非常に簡単です。
製品の完全性を試すためにキャッシュを設定できます。
デメリット:
マルチコアCPUを最大限に活用できない(問題を解決するために複数のプロセスを開いてしまう可能性がある、タスク分割などのロジックを自分で処理する必要がある)。
テスト後の最大同時実行数は 500 (または 512?) で、最大同時実行数を超えると常に失敗します。
現時点ではレジューム機能はありません。
現在のタスクはアトミックであるため、大きなファイルをいくつかの部分に分割し、個別のスレッドを開いてダウンロードすることはできません。

http://www.bkjia.com/PHPjc/824988.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/824988.html技術記事 Curl マルチスレッドの例と原理を紹介します。私が間違っている場合は教えてください。PHP マニュアルでは不明瞭な、curl_multi 関数ファミリーについて頭を悩ませている人が多いと思います...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート