網站根目錄下有一個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秒後輸出了結果,等待期間程式沒有任何回應。
我想達到的效果是每當一個curl線程請求完成,馬上能在終端輸出一個結果:demon。
請問大家該如何實現?如果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秒後輸出了結果,等待期間程式沒有任何回應。
我想達到的效果是每當一個curl線程請求完成,馬上能在終端輸出一個結果:demon。
請問大家該如何實現?如果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貌似沒有異步能力吧