Heim  >  Artikel  >  Backend-Entwicklung  >  php curl多线程请求如何让每个线程请求完马上输出结果,而不是等所有请求完成一并输出?

php curl多线程请求如何让每个线程请求完马上输出结果,而不是等所有请求完成一并输出?

WBOY
WBOYOriginal
2016-09-06 08:57:091370Durchsuche

网站根目录下有一个test.html,内容仅有文字demo。

<code>    demo
</code>

这是curl.php

<code><php for curl_setopt curl_multi_init foreach as> $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); 


</php></code>

设置了500个并发数,所以等待了大约10秒后输出了结果,等待期间程序没有任何响应。
php curl多线程请求如何让每个线程请求完马上输出结果,而不是等所有请求完成一并输出?

我想达到的效果是每当一个curl线程请求完成,马上能在终端输出一个结果:demon。

php curl多线程请求如何让每个线程请求完马上输出结果,而不是等所有请求完成一并输出?

请问大家应该如何去实现?如果Php实现不了的话,NodeJs,Python的解决方案都可以接受,谢谢了

回复内容:

网站根目录下有一个test.html,内容仅有文字demo。

<code>    demo
</code>

这是curl.php

<code><php for curl_setopt curl_multi_init foreach as> $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); 


</php></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貌似没有异步能力吧

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn