浅谈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 相关文章推荐
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
PHP 分页类(模仿google)-面试题目解答
Sep 13 PHP
PHP遍历数组的几种方法
Mar 22 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
PHP速成大法
Jan 30 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
Oct 19 PHP
php实现对文件压缩简单的方法
Sep 29 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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笔记之:数据类型与常量的使用分析
2013/05/14 PHP
PHP之sprintf函数用法详解
2014/11/12 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
golang与PHP输出excel示例
2016/07/22 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
Javascript优化技巧之短路表达式详细介绍
2015/03/27 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
Angularjs在初始化未完毕时出现闪烁问题的解决方法分析
2016/08/05 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
python33 urllib2使用方法细节讲解
2013/12/03 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
什么是SCM(软件配置管理)
2014/08/16 面试题
中学运动会广播稿
2014/01/19 职场文书
大学生作弊检讨书
2014/02/19 职场文书
高考励志标语
2014/06/05 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
Python实现简繁体转换
2021/06/07 Python