zoukankan      html  css  js  c++  java
  • [转]curl_multi 实现准多进程发请求

    FROM : http://blog.sina.com.cn/s/blog_515b90d00100jtnv.html

    curl_multi函数族:
    curl_multi_close
    curl_multi_exec
    curl_multi_getcontent
    curl_multi_add_handle
    curl_multi_info_read
    curl_multi_init
    curl_multi_remove_handle
    curl_multi_select

    用法步骤:
    第一步:调用curl_multi_init
    第二步:循环调用curl_multi_add_handle
    这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。
    第三步:持续调用curl_multi_exec
    第四步:根据需要循环调用curl_multi_getcontent获取结果
    第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close
    第六步:调用curl_multi_close

    下面看我在一个小项目中的使用:

      public function Request($requestdata,$kw)
        { 
            $mh = curl_multi_init();
            $running=null;
            $user_agent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
            foreach($requestdata as &$data)
            {
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $data['url']);  
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
                curl_setopt($ch, CURLOPT_TIMEOUT , 100000);  
                curl_multi_add_handle($mh,$ch);
                $data['ch']=$ch;
                $data['start']=microtime(1);
            }unset($data);
            do{
                while(($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
                while($done = curl_multi_info_read($mh)) {
                    foreach($requestdata as $data)
                    {
                        if ($data['ch'] === $done['handle']) {
                            $html = curl_multi_getcontent($done['handle']);
                            call_user_func($data['callback'], $data['url'], $html,round((microtime(1)-$data['start']),2),$kw);
                            curl_multi_remove_handle($mh, $done['handle']);
                        }
                    }
                }
                if (!$running) break;
                while (($res = curl_multi_select($mh)) === 0);
                if ($res === false) break;
            }while(true);
            curl_multi_close($mh);
        }
  • 相关阅读:
    [JS]手写动画最小时间间隔设置
    [CSS3]chrome浏览器中支持汉字的最小像素是12px,如何让显示更小的字体
    [HTML,CSS]div+css垂直水平居中
    promise经典题目
    HTML5新兴API
    使用MessageChannel(消息通道)进行深拷贝
    原生js手写Promise
    github图片显示不出来-已解决
    前端原生js加密解密
    vue-cli3前端工程静态文件下载
  • 原文地址:https://www.cnblogs.com/Athrun/p/curl_multi.html
Copyright © 2011-2022 走看看