基于PHP编程注意事项的小结(5)


    $mrc = curl_multi_init(); 
    //发出请求 
    ....... 
    $active = null; 
            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); 
                } 
            } 
    //下面是处理请求返回的结果 


但如果我有1000个请求,那么curl批处理将并发1000个请求,显然是不合理,所以应该要控制一个并发数,并且将剩余的连接添加到请求队列里:
参考:How to use curl_multi() without blocking

复制代码 代码如下:


    <?php 
    $connomains = array( 
        //2.php自己去些 
       "http://localhost/2.php?id=1",//sleep(1)秒 
       "http://localhost/2.php?id=2",//sleep(2)秒 
       "http://localhost/2.php?id=5",//sleep(5)秒 
    ); 

    $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]);//加入多处理句柄 
    } 

    $active = 0;//连接数 

    do { 
      do{ 
          //这里$active会被改写成当前未处理数 
          //全部处理成功$active会变成0 
          $mrc  = curl_multi_exec($mh, $active); 

          //这个循环的目的是尽可能的读写,直到无法继续读写为止(返回CURLM_OK) 
          //返回(CURLM_CALL_MULTI_PERFORM)就表示还能继续向网络读写 
      }while($mrc==CURLM_CALL_MULTI_PERFORM); 

     
    //如果一切正常,那么我们要做一个轮询,每隔一定时间(默认是1秒)重新请求一次 
    //这就是curl_multi_select的作用,它在等待过程中,如果有就返回目前可以读写的句柄数量,以便 
    //继续读写操作,0则没有可以读写的句柄(完成了) 
    } while ($mrc==CURLM_OK&& $active &&curl_multi_select($mh)!=-1);//直到出错或者全部读写完毕 

    if ($mrc != CURLM_OK) { 
      print "Curl multi read error $mrc/n"; 
    } 

    // retrieve data 
    foreach ($connomains as $i => $url) { 
      if (($err = curl_error($conn[$i])) == '') { 
       $res[$i]=curl_multi_getcontent($conn[$i]); 
      } else { 
       print "Curl error on handle $i: $err/n"; 
      } 
      curl_multi_remove_handle($mh,$conn[$i]); 
      curl_close($conn[$i]); 
    } 
    curl_multi_close($mh); 

    print_r($res); 
    ?>  


有的人为了省事,这样写:

do { curl_multi_exec($mh,$active); } while ($active);

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/e149b6fd7700581b5cab3c74f1873957.html