ホームページ  >  記事  >  バックエンド開発  >  php_PHPチュートリアルにおけるcurl_multiシリーズ関数の使用例

php_PHPチュートリアルにおけるcurl_multiシリーズ関数の使用例

WBOY
WBOYオリジナル
2016-07-13 10:21:52927ブラウズ

phpのcurl_multiシリーズ関数の使用例

多くの人が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 5.0.0RC1 CLI / FreeBSD 5.2.1 でテストされた、PHP からのカールマルチの簡単で汚い例です
*/

$connomains = array(
"http://www.baidu.com/"、
「http://www.google.com/」、
「http://www.jb51.net/」
);
$mh =curl_multi_init();

foreach ($connomains as $i => $url) {
$conn[$i]=curl_init($url);
curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,1);
curl_multi_add_handle ($mh,$conn[$i]);
}

do { $n=curl_multi_exec($mh,$active) } while ($active);

foreach ($connomains as $i => $url) {
$res[$i]=curl_multi_getcontent($conn[$i]);
curl_close($conn[$i]);
}

print_r($res);

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

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

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

コードは次のとおりです:

やります{
$mrc =curl_multi_exec($mh,$active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active および $mrc == CURLM_OK) {
If (curl_multi_select($mh) != -1) {
やります{
                                                                                                                                                                                                                                                                                                                                                                           ​                                                                                                                      }


$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]);

を使用します。

http://www.bkjia.com/PHPjc/852812.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/852812.html技術記事 PHP のcurl_multi シリーズ関数の使用例 PHP マニュアルでは不明瞭なcurl_multi 関数群に頭を悩ませている人が多いと思います。これらの関数にはドキュメントがほとんどなく、示されている例は簡単なので理解できます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。