ホームページ >バックエンド開発 >PHPチュートリアル >php_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 からのcurl-multiの簡単で汚い例です。PHP 5.0.0RC1 CLI / FreeBSD 5.2.1
*/
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% になる可能性があります。
$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関数がバイナリデータをうまく処理できなかったため、このバグを発見しました