以下のコードの引用元のサイト(http://qiita.com/Hiraku/items/1c67b51040246efb4254)を見て色々とテストしようとしてるのですがよくわかりません。
PHP
1/* 2 * 2) リクエストを開始する 3 * - curl_multiでは即座に制御が戻る(レスポンスが返ってくるのを待たない) 4 * - いきなり失敗するケースを考えてエラー処理を書いておく 5 * - do~whileはlibcurl<7.20で必要 6 */ 7do { 8 $stat = curl_multi_exec($mh, $running); //multiリクエストスタート 9} while ($stat === CURLM_CALL_MULTI_PERFORM); 10if ( ! $running || $stat !== CURLM_OK) { 11 throw new RuntimeException('リクエストが開始出来なかった。マルチリクエスト内のどれか、URLの設定がおかしいのでは?'); 12} 13 14/* 15 * 3) レスポンスをcurl_multi_selectで待つ 16 * - 何かイベントがあったらループが進む 17 * selectはイベントが起きるまでCPUをほとんど消費せずsleep状態になる 18 * - どれか一つレスポンスが返ってきたらselectがsleepを中断して何か数字を返す。 19 * 20 */ 21do switch (curl_multi_select($mh, $TIMEOUT)) { //イベントが発生するまでブロック 22 // 最悪$TIMEOUT秒待ち続ける。 23 // あえて早めにtimeoutさせると、レスポンスを待った状態のまま別の処理を挟めるようになります。 24 // もう一度curl_multi_selectを繰り返すと、またイベントがあるまでブロックして待ちます。 25 26 case -1: //selectに失敗。ありうるらしい。 https://bugs.php.net/bug.php?id=61141 27 usleep(10); //ちょっと待ってからretry。ここも別の処理を挟んでもよい。 28 do { 29 $stat = curl_multi_exec($mh, $running); 30 } while ($stat === CURLM_CALL_MULTI_PERFORM); 31 continue 2; 32 33 case 0: //タイムアウト -> 必要に応じてエラー処理に入るべきかも。 34 continue 2; //ここではcontinueでリトライします。 35 36 default: //どれかが成功 or 失敗した 37 do { 38 $stat = curl_multi_exec($mh, $running); //ステータスを更新 39 } while ($stat === CURLM_CALL_MULTI_PERFORM); 40 41 do if ($raised = curl_multi_info_read($mh, $remains)) { 42 //変化のあったcurlハンドラを取得する 43 $info = curl_getinfo($raised['handle']); 44 echo "$info[url]: $info[http_code]\n"; 45 $response = curl_multi_getcontent($raised['handle']); 46 47 if ($response === false) { 48 //エラー。404などが返ってきている 49 echo 'ERROR!!!', PHP_EOL; 50 } else { 51 //正常にレスポンス取得 52 echo $response, PHP_EOL; 53 } 54 curl_multi_remove_handle($mh, $raised['handle']); 55 curl_close($raised['handle']); 56 } while ($remains); 57 //select前に全ての処理が終わっていたりすると 58 //複数の結果が入っていることがあるのでループが必要 59 60} while ($running); 61echo 'finished', PHP_EOL; 62curl_multi_close($mh);
まず、curl_multi_execの関数の意味がよくわかりません。
リクエストを開始するときにも呼んでるし、イベントが発生した時にも呼んでいます。
リクエスト開始したら後は待って受信するだけだと思うんですが、何で複数回呼ぶ必要があるんでしょうか?
リクエスト開始するためだけの関数じゃないんでしょうか?
また、CURLM_CALL_MULTI_PERFORMの定数の意味もわからないので教えてほしいです。
CURLM_CALL_MULTI_PERFORMを返さなくなったということは何を意味するんでしょうか?
これを返さなくなったらそのまま後続の処理を実行してますが、$statにエラーが返ってないかを確認しなくていいのでしょうか?
とりあえずまずこれらの質問にご回答よろしくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/21 07:02
2016/02/22 00:03
2016/02/23 01:30