curl 多进程任务

curl 添加多进程任务

参考网址:http://php.net/manual/zh/book.curl.php

    http://blog.csdn.net/xueling022/article/details/51907990

 

    public function test()
    {
        $urls=array(
            "www.baidu.com",
            "www.flowerplus.cn",
            "www.taobao.com"
        );
        $res=self::getMultipleDocuments($urls,null);
        print_rr($res);
    }

    private static function getMultipleDocuments($nodes, $referer){
        if(!$referer){
            $referer = $nodes[0];
        }
        $node_count = count($nodes);

        $curl_arr = array();
        $master = curl_multi_init();

        for($i = 0; $i < $node_count; $i++)
        {
            $curl_arr[$i] = curl_init($nodes[$i]);
            curl_setopt($curl_arr[$i], CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl_arr[$i],CURLOPT_FRESH_CONNECT,true);
            curl_setopt($curl_arr[$i],CURLOPT_CONNECTTIMEOUT,1);//让链接立即返回
            curl_setopt($curl_arr[$i],CURLOPT_TIMEOUT,1);//让链接立即返回
            curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
            curl_setopt($curl_arr[$i],CURLOPT_REFERER,$referer);

            curl_multi_add_handle($master, $curl_arr[$i]);
        }
        $result = array();
        // 轮询
        do {
            while (($execrun = curl_multi_exec($master, $running)) == CURLM_CALL_MULTI_PERFORM) ;
            if ($execrun != CURLM_OK) {
                break;
            }

            // 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024
            while ($done = curl_multi_info_read($master))
            {
                // 从请求中获取信息、内容、错误
                $info = curl_getinfo($done['handle']);
                $output = curl_multi_getcontent($done['handle']);
                $error = curl_error($done['handle']);

                // 将请求结果保存,我这里是打印出来
                $result[]=array(
                    'errno'=>$done['result'],
                    'msg'=>empty($error)?"success":$error
                );
                
                // 把请求已经完成了得 curl handle 删除
                curl_multi_remove_handle($master, $done['handle']);
            }
            // 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100%
            if ($running) {
                $rel = curl_multi_select($master, 1);
                if($rel == -1){
                    usleep(1000);
                }
            }
            if( $running == false){
                break;
            }
        } while (true);
        curl_multi_close($master);
        return $result;
    }

 

posted @ 2017-06-05 17:48  jmst  阅读(50)  评论(0)    收藏  举报