[PHP-users 35658] cURL_multiの挙動について質問させてください
noguti
valilian @ mail.goo.ne.jp
2012年 1月 27日 (金) 20:50:14 JST
cURL_multiについて質問させてください。
1.
マニュアルを見ると、例で
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
のように書かれています。
しかし、挙動が理解できません 。
何故全く同じdo~whileを2回も書いているのでしょうか?
var_dump()などしましたが、分かりませんでした。
マニュアルの下に書かれている外国の方のサンプルでは、1回のみ書かれているのもあり、自分もそれで取得の確認は出来ました。
某掲示板で質問したところ、「multiの実行完了とサブ接続の実行完了の違い」と言われましたが、自分には理解が出来ませんでした。
上記のサンプルコードはどのようになっているのでしょうか?
2.
curl_multiを使った場合、取得中のエラー等による制御方法が分かりません。
自分は
$active = NULL;
do
{
curl_multi_exec($mh, $active);
} while ($active > 0);
$results = array();
for ($i = 0; $i < $node_count; $i++)
{
$results[$url_list[$i]] = curl_multi_getcontent($curl_arr[$i]);
$info = curl_getinfo($curl_arr[$i]);
//TODO:エラー処理はこの位置で正しい?
//以下はManual参考
if (curl_errno($curl_arr[$i]))
{
echo 'Curl error: ' . curl_error($curl_arr[$i]);
}
curl_multi_remove_handle($mh, $curl_arr[$i]);
curl_close($curl_arr[$i]);
}
curl_multi_close($mh);
のようにしたのですが、存在しないurlや404を返すurlを指定しても、curl_errno()やcurl_error()をvar_dump()しても0が返ってきます。
「StatusCodeが200以外の場合は」とか、「相手との通信がおかしい」とか「30秒以上かかったらエラー」とかで分岐したいと考えております。
1.のコード中などには書き入れるような場所もないと思うので、2.で書いたコードの様にfor()内などで書くのではないかと思うのですが・・・。
curl_getinfo()の位置はここでいいのだろうと思ってはいます。
具体的にアドバイス頂けないでしょうか?
長くなりましたが、申しわけございませんが以上の点、宜しくお願いいたします。
PHP-users メーリングリストの案内