首頁  >  文章  >  後端開發  >  php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

WBOY
WBOY原創
2016-09-06 08:57:091419瀏覽

網站根目錄下有一個test.html,內容只有文字demo。

<code>    demo
</code>

這是curl.php

<code><php?

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

//创建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); 

//启动多线程
foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);  

    //在这里输出内容
    echo "$result[$k]\n"      
    
    curl_multi_remove_handle($mh,$ch);
}

curl_multi_close($mh); 


</code>

設定了500個並發數,所以等待了大約10秒後輸出了結果,等待期間程式沒有任何回應。
php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

我想達到的效果是每當一個curl線程請求完成,馬上能在終端輸出一個結果:demon。

php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

請問大家該如何實現?如果Php實作不了的話,NodeJs,Python的解決方案都可以接受,謝謝了

回覆內容:

網站根目錄下有一個test.html,內容只有文字demo。

<code>    demo
</code>

這是curl.php

<code><php?

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

//创建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); 

//启动多线程
foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);  

    //在这里输出内容
    echo "$result[$k]\n"      
    
    curl_multi_remove_handle($mh,$ch);
}

curl_multi_close($mh); 


</code>

設定了500個並發數,所以等待了大約10秒後輸出了結果,等待期間程式沒有任何回應。
php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

我想達到的效果是每當一個curl線程請求完成,馬上能在終端輸出一個結果:demon。

php curl多執行緒請求如何讓每個執行緒請求完馬上輸出結果,而不是等所有請求完成一併輸出?

請問大家該如何實現?如果Php實作不了的話,NodeJs,Python的解決方案都可以接受,謝謝了

nodejs就是異步的

可以用ob_start()和ob_flush(),前提是要關閉output_buffering,預設有4k大小,沒關的話會因為你內容太少而無效。如果是瀏覽器訪問的話就無解了,因為瀏覽器還有個buffer,太少了也是看不到效果。下面在命令列測試ok,如果頁面沒ini_set權限的話直接去php.ini設定output_buffering=0
順便提下,循環500次,本地php7測試執行1到2秒,php5.4要28秒。

<code class="php"><?php
ini_set('output_buffering', 0);
ob_start();
$chArr=[];
for($i=0;$i<500;$i++){
    $chArr[$i]=curl_init("http://dev.site/test.html");
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}


$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);


foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);
    echo "$result[$k]\n";
    ob_flush();
    flush();
    sleep(1);
    curl_multi_remove_handle($mh,$ch);
}
ob_end_flush();
curl_multi_close($mh);</code>

雖然是多線程的,但是個同步的,不是異步的,php貌似沒有異步能力吧

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn