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

可以用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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值