curl multi 多线程

<?php

function Curl_Lib($post_array){

   $queue = curl_multi_init();

   foreach ($post_array as $data) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'http://blog.mlloo.cn/qq/post.php');
        curl_setopt($ch, CURLOPT_HEADER, false);
        //curl_setopt($ch, CURLOPT_TIMEOUT, 1);
        //curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //超时时间200毫秒 
        //curl_setopt($ch, CURLOPT_NOSIGNAL, true);
        curl_setopt($ch, CURLOPT_POST,true);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
        //向curl批处理会话中添加单独的curl句柄
        curl_multi_add_handle($queue, $ch);
        
    }

    $active = null;

    // 执行批处理句柄
    do {

        /*当栈中的句柄还有数据需要传送时,就会返回 CURLM_CALL_MULTI_PERFORM,当返回CURLM_OK只是意味着数据传送完毕或者没有数据 可传送。此方法是不阻塞的,也就是说一旦栈中某个或多个curl句柄有数据读取或者写入,就可以调用此方法传送数据,并立即返回栈中句柄的活动状态。*/
        while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM){
            
        if ($code != CURLM_OK) {
            break; 
               }
             }
 
        //curl_multi_info_read获取当前解析的cURL的相关传输信息
        //handle    cURL资源类型表明它有关的句柄。
        while ($done = curl_multi_info_read($queue)) {
 
            //curl_getinfo获取网页信息
            //$info = curl_getinfo($done['handle']);
            //返回最后一次的错误号
            //$error = curl_error($done['handle']);
            //如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
            //$results = curl_multi_getcontent($done['handle']);
            //Array compact函数 
            //$responses[] = compact('info', 'error', 'results');
            $responses[] = $results;
            //移除curl批处理句柄资源中的某个句柄资源
            curl_multi_remove_handle($queue, $done['handle']);
            //关闭一个cURL会话
            curl_close($done['handle']);
        }
 
        
        if ($active > 0) {
            curl_multi_select($queue, 1.0);
        }
 
    }while($active);

    //关闭一组cURL句柄。
    curl_multi_close($queue);

return $responses;

}



/*会造成CPU Loading过高,因为$active要等全部url数据接受完毕才变成false,所以这里用到了curl_multi_exec的返回值判断是否还有数据,当有数据的时候就不停调用curl_multi_exec,没有执行数据就会sleep,如此就会避免CPU Loading 100%了。*/



//测试
require 'curl_multi.php';



for($i=0 ; $i<10 ; $i++){

$Str=time().rand(0,9999);

$post_date[] = 'name='.$Str.'&email='.$Str.'@qq.com&action=signup';

}

//并发测试
print_r(Curl_Lib($post_date));

//print_r($post_date);