php中foreach结合curl实现多线程的方法分析


Posted in PHP onSeptember 22, 2016

本文实例讲述了php中foreach结合curl实现多线程的方法。分享给大家供大家参考,具体如下:

多线程是php不支持的但我们可以通过foreach来伪多线程了,但这个伪多线程速度不一定比单线程要单到哪里去了,具体来看个例子.

在利用foreach语句循环图片URL,并通过CURL将所有图片进行本地保存的函数时,出现了只能采集到一个的问题,现将foreach和CURL结合进行多URL请求的方法进行下总结.

方法1:循环请求

$sr=array(url_1,url_2,url_3);
foreach ($sr as $k=>$v) {
 $curlPost=$v.'?f=传入参数';
 $ch = curl_init($curlPost) ;
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回
 curl_setopt($ch, CURLOPT_BINARYTRANSFER, true) ; // 在启用 CURLOPT_RETURNTRANSFER 时候将获取数据返回
 $data = curl_exec($ch) ;
 echo $k.'##:'.$data.'<br>';
}
curl_close($ch);

上面代码需要特别注意的是,curl_close 一定要放在foreach循环结束的外面,如果放在里面的话,就会出现我上面提到的多个IMGURL,只能采集到一个URL的问题.

方法2:多线程循环

<?php
multi_threads_request($nodes){
  $mh = curl_multi_init();
  $curl_array = array();
  foreach($nodes as $i => $url)
  {
   $curl_array[$i] = curl_init($url);
   curl_setopt($curl_array[$i], CURLOPT_RETURNTRANSFER, true);
   curl_multi_add_handle($mh, $curl_array[$i]);
  }
  $running = NULL;
  do {
   usleep(10000);
   curl_multi_exec($mh,$running);
  } while($running > 0);
  $res = array();
  foreach($nodes as $i => $url)
  {
   $res[$url] = curl_multi_getcontent($curl_array[$i]);
  }
  foreach($nodes as $i => $url){
   curl_multi_remove_handle($mh, $curl_array[$i]);
  }
  curl_multi_close($mh);
  return $res;
}
print_r(multi_threads_request(array(
 'https://3water.com',
 'http://tools.3water.com',
));

这里主要利用curl_multi_init()实现多个url 的请求,不过由于php自身并不支持多线程,所以伪多线程速度也不见得会比单线程快.

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php在数据库抽象层简单使用PDO的方法
Nov 03 PHP
Laravel重写用户登录简单示例
Oct 08 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
PHP区块查询实现方法分析
May 12 PHP
使用ucenter实现多站点同步登录的讲解
Mar 21 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
Dec 04 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 PHP
PHP终止脚本运行三种实现方法详解
Sep 01 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 #PHP
php微信公众平台配置接口开发程序
Sep 22 #PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 #PHP
php中二分法查找算法实例分析
Sep 22 #PHP
Yii2中SqlDataProvider用法示例
Sep 22 #PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 #PHP
php简单压缩css样式示例
Sep 22 #PHP
You might like
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
深入解析WordPress中加载模板的get_template_part函数
2016/01/11 PHP
php实现文件预览功能
2017/05/23 PHP
javascript innerHTML使用分析
2010/12/03 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
jquery中JSON的解析方式
2015/03/16 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
js命名空间写法示例
2015/12/18 Javascript
原生node.js案例--前后台交互
2017/02/20 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python中使用bidict模块双向字典结构的奇技淫巧
2016/07/12 Python
详解python OpenCV学习笔记之直方图均衡化
2018/02/08 Python
python读取和保存视频文件
2018/04/16 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
2020/05/09 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
使用python创建Excel工作簿及工作表过程图解
2020/05/27 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
写好自荐信的技巧
2013/11/08 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
中学生思想品德评语
2014/12/31 职场文书
Python进程池与进程锁之语法学习
2022/04/11 Python