可以用ob_start()和ob_flush(),前提是要关闭output_buffering,默认有4k大小,没关的话会因为你内容太少而无效。如果是浏览器访问的话就无解了,因为浏览器还有个buffer,太少了也是看不到效果。下面在命令行测试ok,如果页面没ini_set权限的话直接去php.ini设置output_buffering=0
补充:
php的curl多线程是通过不断调用curl_multi_exec($mh,$running);来获取内容,当do while执行完的时候已经下载完远程内容了,后面再循环输出已经达不到下载完一个就输出一个的效果了。
可以通过循环$chArr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$chArr数组元素个数为0。
我这边php5.4测试,300以上执行不完就卡掉了;php7开到1500以上测试出500错误执行不完。量太大的话,php可能不太适合,或者这操作方式不对。
修改后代码如下:
ini_set('output_buffering', 0);
ob_start();
$chArr=[];
for($i=0;$i<500;$i++){
$chArr[$i]=curl_init("http://127.0.0.1/x.php");
curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}
$mh = curl_multi_init();
foreach($chArr as $k => $ch){
curl_multi_add_handle($mh,$ch);
}
$running = null;
while(count($chArr)>0){
@curl_multi_exec($mh,$running);
foreach($chArr as $k => $ch){
if($result[$k]= curl_multi_getcontent($ch)){
echo "$result[$k]\n";
ob_flush();
flush();
curl_multi_remove_handle($mh,$ch);
unset($chArr[$k]);
}
}
}
echo 'ok';
ob_end_flush();
curl_multi_close($mh);