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


Posted in PHP onMarch 08, 2019

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

//设置缓冲为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($curl_Arr[$i],CURLOPT_RETURNTRANSFER,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,内容如下

1 sleep(10);
2 echo 'seccess';exit;

表示等待十秒后数据下面语句。
然后我在命令行执行该程序结果如下:

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

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

以上所述是小编给大家介绍的php使用curl模拟多线程发送请求详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
php array_merge函数使用需要注意的一个问题
Mar 30 PHP
分享10段PHP常用代码
Nov 11 PHP
PHP开发中常用的十个代码样例
Feb 02 PHP
PHP实现文件上传与下载实例与总结
Mar 13 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
php中文语义分析实现方法示例
Sep 28 PHP
Laravel获取所有的数据库表及结构的方法
Oct 10 PHP
PHP htmlspecialchars()函数用法与实例讲解
Mar 08 #PHP
浅谈PHP进程管理
Mar 08 #PHP
PHP多进程通信-消息队列使用
Mar 08 #PHP
浅谈PHP匿名函数和闭包
Mar 08 #PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
Mar 08 #PHP
ThinkPHP中图片按比例切割的代码实例
Mar 08 #PHP
PHP的微信支付接口使用方法讲解
Mar 08 #PHP
You might like
基于php实现七牛抓取远程图片
2015/12/01 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
laravel http 自定义公共验证和响应的方法
2019/09/29 PHP
php生成HTML文件的类方法
2019/10/11 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
jQuery select表单提交省市区城市三级联动核心代码
2014/06/09 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
jQuery3.0中的buildFragment私有函数详解
2016/08/16 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
python访问抓取网页常用命令总结
2017/04/11 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
《钱学森》听课反思
2014/03/01 职场文书
学生会竞聘书范文
2014/03/31 职场文书
解除劳动合同协议书
2014/04/14 职场文书
《秋游》教学反思
2014/04/24 职场文书
快餐公司创业计划书
2014/04/29 职场文书
计算机软件专业求职信
2014/06/10 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
孔庙导游词
2015/02/04 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
flex弹性布局详解
2022/03/20 HTML / CSS