[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 メーリングリストの案内