关闭

php中curl_multi批处理请求

标签: phpcURL批处理
357人阅读 评论(0) 收藏 举报
分类:

curl_multi
同时请求多个url,而不是一个一个依次请求。
步骤总结如下:
1. 调用curl_multi_init
2. 循环调用curl_multi_add_handle(这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle)。
3. 持续调用curl_multi_exec
4. 根据需要循环调用curl_multi_getcontent获取结果
5. 调用curl_multi_remove_handle,并为每个子handle调用curl_close
6. 调用curl_multi_close


resource curl_multi_init(void)
允许并行地处理批处理cURL句柄。成功时返回一个cURL批处理句柄,失败时返回FALSE.

int curl_multi_add_handle(resource $mh, resource $ch)
增加ch句柄到批处理会话mh
参数:mh 由curl_multi_init()返回的cURL多个句柄。
ch 由curl_init()返回的cURL句柄。
成功时返回0,失败时返回CURLM_XXX之一的错误码。

int curl_multi_exec(resource $mh, int &$still_running)
处理在栈中的每一个句柄。无论该句柄需要读取或写入数据都可调用此方法。
mh 由curl_multi_init()返回的cURL多个句柄。
still_running 一个用来判断操作是否仍在执行的标识的引用。
返回值
一个定义于cURL预定义常量中的cURL代码。
注意:该函数仅返回关于整个批处理栈相关的错误。即使返回CURLM_OK时单个传输仍可能有问题。
curl_multi_exec在底层调用了libcurl的curl_multi_perform函数。在curl7.20.0以前,此函数会返回一个CURLM_CALL_MULTI_PERFORM值,代表它希望立刻再一次被调用。所以就有了检查此返回值,再一次调用curl_multi_exec函数的demo。在7.20.0之后,libcurl把这个工作自己在内部做了,所以就不用应用端再做了,直接调用curl_multi_exec,只检查$still_running参数就行了。

string curl_multi_getcontent(resource $ch)
如果CURLOPT_RETURNTRANSFER作为一个选项被设置到一个具体的句柄,那么这个函数将会以字符串的形式返回那个cURL句柄获取的内容。
ch 由curl_init()返回的cURL句柄。

Int curl_multi_select(resource $mh)
阻塞直到cURL批处理连接中有活动连接。
返回值
成功时返回描述符集合中描述符的数量。失败时,select失败时返回-1,否则返回超时(从底层的select系统调用)。


这个范例将会创建2个cURL句柄,把它们加到批处理句柄,然后并行地运行它们。

      //创建一对cURL资源
      $ch1=curl_init();
      $ch2=curl_init();

      //设置URL和相应的选项
      curl_setopt($ch1, CURLOPT_URL, "http://404.122.195.246:8089/isactive");
      curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch1, CURLOPT_HEADER, false);
      curl_setopt($ch1, CURLOPT_URL, "http://404.122.195.245:8089/isactive");
      curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch1, CURLOPT_HEADER, false);

      //创建批处理cURL句柄
      $mh=curl_multi_init();

      //增加2个句柄
      curl_multi_add_handle($mh, $ch1);
      curl_multi_add_handle($mh, $ch2);

      $running=null;
      //执行批处理句柄
      do{
        usleep(10000);
        curl_multi_exec($mh, $running);
      }while($running>0);

      //关闭全部句柄
      curl_multi_remove_handle($mh, $ch1);
      curl_multi_remove_handle($mh, $ch2);
      curl_multi_close($mh);

批处理

$aUrls=array(
            "http://402.112.195.246:8089",
            "http://2.112.195.246:8092",
            "http://2.112.195.245:8095",
            "http://2.112.195.246:8094"

        );
      

      $mh=curl_multi_init();
      $aCurlHandles=array();
      foreach ($aUrls as $id=>$url){
        $url=$url.'/isactive';
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10000);

        $aCurlHandles[$url]=$ch;
        curl_multi_add_handle($mh, $ch);
      }

      $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){
          echo "error<br/>";
          usleep(5000);
        }
          
        do{
          $mrc=curl_multi_exec($mh, $active);
        }while($mrc==CURLM_CALL_MULTI_PERFORM);
      }

      /*usleep(10000);*/
      foreach($aCurlHandles as $url=>$ch){
        $html=curl_multi_getcontent($ch);
        echo $url.'----'.$html.'<br/>';
        curl_multi_remove_handle($mh, $ch);
      }

      curl_multi_close($mh);












































0
0
查看评论

curl_multi实现并发请求

<?php // 创建一对cURL资源 $ch1 = curl_init(); $ch2 = curl_init();// 设置URL和相应的选项 curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_set...
  • AKai66
  • AKai66
  • 2017-10-04 02:01
  • 423

PHP使用curl multi要注意的问题:每次使用curl multi同时并发多少请求合适

PHP的curl multi可以使用多线程处理http请求,一定程度上可以提高请求接口的效率。但是,启用多线程也是会消耗资源的事情,那么每次curl multi同时并发多少个请求合适呢? 接下来做了以下一个实验,在开始的时候,先说说实验的结论: 实验结论 1)首先要检查发起请求服务器的网络带宽是否正...
  • loophome
  • loophome
  • 2016-11-25 10:25
  • 3599

PHP使用curl_multi并发请求

class CurlMultiUtil { /** * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档 */ private static function getCurlObject($url,$postData=array(),$h...
  • u013474436
  • u013474436
  • 2016-10-28 15:07
  • 17620

编程实践5—php curl_multi并发问题

如果你用php进行并发请求,那么你可能会遇到没有数据返回的情况,这是本人在做并发请求遇到的实例。 官网的例子一般都会告诉你,multicurl可以实现并发网络访问,代码如下: <?php // create both cURL resources $ch1 = curl_init();...
  • abcd_d_
  • abcd_d_
  • 2016-10-28 12:02
  • 326

PHP并行编程探索之二(curl_multi函数组)

使用pcntl扩展实现的多进程终究只能运行在命令行模式,而我们接触的基本上都处在http请求模式下,那就真没有解决办法了么,有人说用curl,自身请求自身,好我们用curl看一下是不是有用:        为方便访问和调试,我使用的是CI框架,直接在控制器里...
  • wujiangwei567
  • wujiangwei567
  • 2017-08-10 09:51
  • 194

cURL multi批处理实现及避免cURL multi造成CPU负载过高问题

cURL multi批处理实现及避免cURL multi造成CPU负载过高问题 发布时间: 2014-04-13 浏览次数:2397 分类: PHP教程 http://www.phpddt.com/php/curl_multi.html 简单的cURL处理如下: $...
  • zhangfeng1133
  • zhangfeng1133
  • 2015-08-31 19:12
  • 554

php中curl_multi的应用

相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子 更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完整的应用例子。curl_multi_add_handle curl_multi_close curl_multi_exec curl_m...
  • oyd
  • oyd
  • 2007-10-11 18:21
  • 12955

php中curl同时发送多个请求curl_multi函数集的用法

一、引言这段时间比较忙,已经很久没有写博客了。今天我就来聊聊我关于curl_multi_*函数集的使用心得,关于http请求的问题。当我们用户php发起一个http请求的时候。我们会首先想到用什么?没错,我们会创建curl来请求。当我们在一次执行中需要发起多个http请求呢。这简单,对每一个URL发...
  • xueling022
  • xueling022
  • 2016-07-14 11:49
  • 6022

php curl_multi批量发送http请求

引子:在Android4.0开发中,发送Http请求已经不允许在主进程中执行了,必须在线程中执行。原因在于Http接口响应时间有可能阻塞主进程事件监听(对于.Net开发,其实也是如此)。但是,由于PHP并没有多线程的概念,那么,如何高效率在PHP中执行多次http请求呢?答案是使用curl_mult...
  • loophome
  • loophome
  • 2015-10-03 16:50
  • 2496

php curl 批量请求

<?php$ch = array(); $res = array(); $conn = array();$urls = array( 'baidu' => "http://www.baidu.com/", 'cheyun'...
  • u013372487
  • u013372487
  • 2016-07-19 16:25
  • 1316
    个人资料
    • 访问:223542次
    • 积分:2915
    • 等级:
    • 排名:第14388名
    • 原创:58篇
    • 转载:151篇
    • 译文:8篇
    • 评论:3条
    最新评论