多くの人がphpマニュアルでは不明瞭なcurl_multiシリーズ関数に頭を悩ませていると思います。ドキュメントはほとんどなく、与えられた例は非常に単純なので理解できません。私もそれらから学びました。完全なアプリケーション例が記載されていない Web ページもたくさんあります。
一般的に、これらの関数の使用を考えるとき、その目的は明らかに、複数の 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 を呼び出す
これは、オンラインで見つかった簡単な例で、著者はこれをダーティ サンプルと呼んでいます (なぜダーティなのかについては後ほど説明します):
$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 段落を次のように変更します。
また: 時々遭遇するかもしれないいくつかの詳細があります:
各リクエストのタイムアウトを制御します。curl_multi_add_handle の前に、curl_setopt を通じて実行します。
コードは次のとおりです:タイムアウトまたはその他のエラーがあるかどうかを判断するには、curl_multi_getcontent の前に、curl_error($conn[$i]);
を使用します。