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);
        }
  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/Athrun/p/curl_multi.html
Copyright © 2011-2022 走看看