ホームページ  >  記事  >  バックエンド開発  >  Curr マルチスレッドを使用して同時実行をシミュレートする方法の詳細な説明_PHP チュートリアル

Curr マルチスレッドを使用して同時実行をシミュレートする方法の詳細な説明_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:06:26821ブラウズ

まず第一に、php のcurl マルチスレッド関数を理解しましょう:

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

#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 のカールマルチ、PHP 5.0.0RC1 CLI / FreeBSD 5.2.1 でテスト済み
*/
$connomains = array(
"http://www.cnn.com/",
"http://www.canada .com/" ,
"http://www.yahoo.com/"
);
$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 関数を使用する必要がありますが、この関数にはほとんどドキュメントがありませんが、PHP のインターフェイスと使用法は C のものとは異なります。 } while($ mrc = = curlm_call_multi_perform);
$active は false になる前にすべての URL データが受信されるまで待機する必要があるため、ここでは、curl_multi_exec の戻り値を使用してデータが存在するかどうかを判断します。データが存在する場合は、curl_multi_exec が継続的に呼び出されます。新しいデータが到着するとすぐに起動して実行を続行できます。この場合の利点は、CPU を不必要に消費しないことです。

さらに: 時々遭遇するかもしれないいくつかの詳細があります:
各リクエストのタイムアウトを制御し、curl_multi_add_handle の前にcurl_setopt を通して実行します:
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
タイムアウトまたはその他のエラーがある場合は、curl_error($conn[$i]); を使用します。

ここでは、curl_multi_getcontent の前に、上記の汚い例を単純に使用します (これで十分ですが、100% の CPU 使用率は見つかりませんでした)。
「Kandian.com」の特定のインターフェイスでの同時実行をシミュレートする機能は、memcache へのデータの読み取りと書き込みです。機密保持のため、関連するデータと結果は掲載されません。

3回シミュレーションし、1回目は10スレッドが同時に1000回リクエスト、2回目は100スレッドが同時に1000回リクエスト、3回目は1000スレッドが同時に100回リクエストされました(これはすでにかなり手間がかかります) , マルチスレッドの1000以上はあえて設定しません)。
curl のマルチスレッド シミュレーションの同時実行にはまだ一定の制限があるようです。

また、マルチスレッドの遅延により結果に大きな誤差があるのではないかとも思い、データを比較して分かりました。初期化と設定にかかる時間に大きな違いはありません。違いは get メソッドにあるため、これは簡単に解消できます~~~

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327618.html技術記事まず、php のカール マルチスレッド関数を理解しましょう。 次のようにコードをコピーします。 #curl_multi_add_handle #curl_multi_close #curl_multi_exec #curl_multi_getcontent #curl_multi_i...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。