切换风格

默认晚霞 雪山 粉色心情 伦敦 花卉 绿野仙踪 加州 白云 星空 薰衣草 城市 简约黑色 简约米色 龙珠
回复 0
     紫钻仅向指定用户开放  

394

主题

411

帖子

5万

积分

管理员

论坛BOSS

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
52007

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

php使用curl模拟多线程发送请求[复制链接]
发表于 2018-11-3 21:41:54 | 显示全部楼层 |阅读模式

目前是游客浏览,请注册

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。

[PHP] 纯文本查看 复制代码
//设置缓冲为0(也可以去php.ini设置)
ini_set('output_buffering', 0);
//打开输出缓冲区
ob_start();
//设置一个空数组
$curl_Arr=[];
//这里模拟20次请求
for($i=0;$i<20;$i++){
    //开启curl连接
    $curl_Arr[$i]=curl_init("http://XXXX/test.php");
    //CURLOPT_RETURNTRANSFER 设置为1表示稍后执行的curl_exec函数的返回是URL的返回字符串,而不是把返回字符串定向到标准输出并返回TRUE;
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
    curl_setopt($chArr[$i], CURLOPT_TIMEOUT, 1);
}

//创建批处理cURL句柄
$mh = curl_multi_init();

foreach($curl_Arr as $k => $ch){
    //curl句柄入栈增加
    curl_multi_add_handle($mh,$ch);
}
$active = null;
while(count($curl_Arr)>0){
    //发起curl_multi请求
    @curl_multi_exec($mh,$active);
    foreach($curl_Arr as $k => $ch){
        //获取句柄的返回值
        if($result[$k]= curl_multi_getcontent($ch)){
            //输出结果
            echo "$result[$k]\n";
            ob_flush();
            //把被释放的数据发送到浏览器
            flush();
            //关闭该句柄
            curl_multi_remove_handle($mh,$ch);
            unset($curl_Arr[$k]);
        }
    }
}
//关闭ouput_buffering机制
ob_end_flush();
//关闭"curl_mulit"句柄
curl_multi_close($mh);


我再服务器上建立一起请求的php页面命名为test.php,内容如下

sleep(10);echo 'seccess';exit;
等待十秒后数据下面语句。

然后我在命令行执行改程序结果如下:

php使用curl模拟多线程发送请求

php使用curl模拟多线程发送请求
上面代码中通过循环$curl_Arr数组来调用curl_multi_getcontent来查询是否有数据。有数据就输出并删除元素,直到$curl_Arr数组元素个数为0。
该模拟多线程实现是通过使用curl的curl_multi系列函数能实现此功能的。至于该系列函数使用介绍,百度一搜一大把。这里就不做说明了。


上一篇:五指CMS网站管理系统 五指cms网站管理系统,网站内容管理...

打赏列表

~~~还没有人打赏~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|五秒论坛 ( 鄂ICP备18019426号 )|申请友情链接

返回顶部