cURL特性之批处理

cURL批处理

cURL还有一个高级特性——批处理句柄(handle)。这一特性允许同时或异步打开多了cURL连接。

【示例】:

<span style="font-family:FangSong_GB2312;font-size:18px;"><?PHP
      //创建两个cURL资源
      $ch1 = curl_init();
      $ch2 = curl_init();
      //指定URL和适当的参数
      curl_setopt($ch1,CURLOPT_URL,"http://lxr.php.net/");
      curl_setopt($ch1,CURLOPT_HEADER,0);
      curl_setopt($ch2,CURLOPT_URL,"http://www.php.net/");
      curl_setopt($ch2,CURLOPT_HEADER,0);
      //创建cURL批处理句柄
      $mh = curl_multi_init();
      //加上前面两个资源的句柄
      curl_multi_add_handle($mh,$ch1);
      curl_multi_add_handle($mh,$ch2);
      //预定义一个状态变量
      $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);
           }
      }
      //关闭各个句柄
      curl_multi_remove_handle($mh,$ch1);
      curl_multi_remove_handle($mh,$ch2);
      curl_multi_close($mh);
?></span>


【解析】:

这里要做的就是打开多个cURL句柄并指派给一个批处理句柄,然后只需在一个while循环里等待它执行完毕。

第一个do …while循环重复调用curl_multi_exec()。这个函数是无隔断的。但会尽可能少的执行。它会返回一个状态值,只要这个值等于常量CURM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做。(例如把对应的URL的HTTP头信息发送出去),也就是说,需要不断调用该函数,直到返回值发生改变。

接下来的while循环,只有在$active变量为true的时候继续这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动连接。接着调用curl_multi_select(),在活动连接出现之前,它都是被屏蔽的。这个函数成功之后,又会进入另一个do…while循环,继续下一条URL。

【说明】:

很多人把这种方式称为cURL多线程处理,而curl_multi_exec并不是多线程,它属于异步处理的范畴。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。