• 技术文章 >后端开发 >php教程

    curl多线程采撷不是采集不到就是采不全

    2016-06-13 12:47:08原创605

    curl多线程采集不是采集不到就是采不全?
    如题,代码如下,请问如何解决?

    /**
    * curl 多线程
    *
    * @param array $array 并行网址
    * @param int $timeout 超时时间
    * @return array
    */
    function Curl_http($array,$timeout){
    $res = array();
    $mh = curl_multi_init();//创建多个curl语柄
    $startime = getmicrotime();
    foreach($array as $k=>$url){
    $conn[$k]=curl_init($url);
    curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//设置超时时间
    curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向级别
    curl_setopt($conn[$k], CURLOPT_HEADER, 0);//这里不要header,加块效率
    curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
    curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);
    curl_multi_add_handle ($mh,$conn[$k]);
    }
    //防止死循环耗死cpu 这段是根据网上的写法
    do {
    $mrc = curl_multi_exec($mh,$active);//当无数据,active=true
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);//当正在接受数据时
    while ($active and $mrc == CURLM_OK) {//当无数据时或请求暂停时,active=true
    if (curl_multi_select($mh) != -1) {
    do {
    $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
    }
    foreach ($array as $k => $url) {
    curl_error($conn[$k]);
    $res[$k]=curl_multi_getcontent($conn[$k]);//获得返回信息
    $header[$k]=curl_getinfo($conn[$k]);//返回头信息
    curl_close($conn[$k]);//关闭语柄
    curl_multi_remove_handle($mh , $conn[$k]); //释放资源
    }
    curl_multi_close($mh);
    $endtime = getmicrotime();
    $diff_time = $endtime - $startime;

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:nbsp curl conn multi CURLOPT
    上一篇: php 打印html标签解决思路 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • 设计API接口时,要注意这些地方!• PHP网站常见一些安全漏洞及防御方法• OPENBIZ - 使应用开发不同于编程_PHP教程• 如何调用这个JS?_PHP教程• Php5.0说明------为面向对象而生的php5_PHP教程
    1/1

    PHP中文网