如何通过PHP-cUrl多线程

时间:2016-09-05 08:10:45

标签: php curl

test.html中,demo字仅包含在内。

    demo

curl.php

<php?

//init curl
$chArr=[];
for($i=0;$i<500;$i++){
    $chArr[$i]=curl_init("http://dev.site/test.html");
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}

//create curl
$mh = curl_multi_init(); 
foreach($chArr as $k => $ch){
    curl_multi_add_handle($mh,$ch); 
}

$running = null;

do{
    curl_multi_exec($mh,$running); 
}while($running > 0); 

//start multi-thread
foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);  

    //and echo out the result
    echo "$result[$k]\n"      

    curl_multi_remove_handle($mh,$ch);
}

curl_multi_close($mh); 

我已经设置了500个请求,大约10秒后得到了输出,并且在处理期间没有响应 no response

是否有显示结果并给我反馈,因为每个卷曲请求都已完成,如下所示?

enter image description here

PS:如果PHP很难这样做,我可以接受Nodejs,Python等。

1 个答案:

答案 0 :(得分:0)

您可能需要使用ob_start()ob_end_flush()

ob_start()打开输出缓冲,所以在回显输出之前将它放在for循环的顶部。

ob_end_flush()发送输出缓冲区并关闭输出缓冲。

所以你的代码看起来像这样,

foreach($chArr as $k => $ch){
    ob_start();
    $result[$k]= curl_multi_getcontent($ch);  

    //and echo out the result
    echo "$result[$k]\n"      
    ob_end_flush();
    curl_multi_remove_handle($mh,$ch);
}