//==============批量获取远程数据(
function async_get_url($url_array, $wait_usec = 0, $pCookie = "") {
    if (!is_array($url_array)) {
        return false;
    }
    $wait_usec = intval($wait_usec);    $data = array();
    $handle = array();
    $mh = curl_multi_init();    $i = 0;
    foreach ($url_array as $url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 50);
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)");
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);        // 使用自动跳转 
        curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
        curl_setopt($ch, CURLOPT_REFERER, $url);
        curl_setopt($ch, CURLOPT_ENCODING, "gzip");
        if ($pCookie != "") {
            curl_setopt($ch, CURLOPT_COOKIEFILE, $pCookie); // 读取上面所储存的Cookie信息 
        }
        curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里
        $handle[$i++] = $ch;
    }
    do {
        $mrc = curl_multi_exec($mh, $active);
        if ($wait_usec > 0)
            usleep($wait_usec);
    }while ($mrc == CURLM_CALL_MULTI_PERFORM);    while ($active and $mrc == CURLM_OK) {
        if (curl_multi_select($mh) != -1) {
            do {
                $mrc = curl_multi_exec($mh, $active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }
    }    foreach ($handle as $i => $ch) {
        $content = curl_multi_getcontent($ch);        $data[0][$i] = (curl_errno($ch) == 0) ? TranscodingStr($content) : false;
        $data[1][$i] = (curl_errno($ch) == 0) ? $url_array[$i] : false;        $content = NULL;
        curl_close($ch);
        curl_multi_remove_handle($mh, $ch);
    }
    curl_multi_close($mh);    return $data;
}
我用这个函数同时获取100个网页的源文件,但是每次成功得到源文件的数量不稳定,有时候能得到100个有时候只能获取到60个左右,curl_error得不到错误剩余那些没有成功获取到的url经过我的测试 curl_multi_getcontent 获取到的为空.这是什么问题,为什么会返回空,也得不到错误,50个以内很少会出现问题我希望能知道具体原因,并且能有解决方法这个问题已经折磨我好几天了,一直得不到解决,我希望你们能够帮助我

解决方案 »

  1.   

    如果确定50个木有问题,100不正常的话,看看是不是跟php配置有问题?
      

  2.   

    你的程序末段的这个  TranscodingStr 是啥么?
    不是PHP与CURL的命令或函数我用了类似你的另一个版本的async_get_url
    我并发十条线路去连不同的资料库的资料表运算,
    在我的个人电脑XP Appserv里面很正常, 但放到公司正式Linux主机上, 
    发现返回的资料时有时无, 没有一次10个资料库都全的, 很不稳定,
    CURLOPT_CONNECTTIMEOUT, 20 与 CURLOPT_TIMEOUT, 30
    跟这个时间限制也无关... 上网看了下
    详细因素有很多可能
    可能主机附载能力太差 无法负荷太多连线数
    可能伺服器网路频宽不足或网路设备不稳封包遗失不过LINUX主机应该比个人电脑强吧.. 所以尚不知道造成的原因
      

  3.   

    http://blog.csdn.net/windqyoung/article/details/8982374
    可以看我写的这个, 如果这不算挖坟的话.注意结束处理的while条件, 经过测试, 每次都可以取得1000条返回信息. 没丢失过.