ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルでのcurl_multiのアプリケーションの分析

php_PHP チュートリアルでのcurl_multiのアプリケーションの分析

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

多くの人が、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-multiの簡単で汚い例です。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){

print_r($res);


全体の使用プロセスはほぼ次のようになります。ただし、この単純なコードには致命的な弱点があります。つまり、do ループ セクションで、URL リクエスト全体が無限ループになります。 CPU 使用率が 100% になる可能性があります。

ここで、curl_multi_select 関数を使用する必要がありますが、この関数にはほとんどドキュメントがありませんが、PHP のインターフェイスと使用法は C のものとは異なります。上記のDOセクションを次のように変更します。Copyコードをコピー

コードは次のとおりです。 ($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_multi_getcontent の前に、curl_error($conn[$i]);

を使用します。

注: php の multi_curl 関数は注意して使用する必要があります。バージョンによっては、curl と php の組み合わせにバグがあるためです。したがって、問題なくデバッグされたコードは、他のマシンでは正しくない可能性があります。

たとえば、今日、curl/7.16.2 バージョンの php5.2.2 で CURLOPT_USERAGENT 属性が特定の値に設定されている場合、送信される実際の HTTP ヘッダーはバイナリ値の文字列になることがわかりました。

このバージョンのphpのstrip_tags関数がバイナリデータをうまく処理できなかったため、このバグを発見しました

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