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 相关文章推荐
我的论坛源代码(六)
Oct 09 PHP
PHP6 mysql连接方式说明
Feb 09 PHP
PHP面向接口编程 耦合设计模式 简单范例
Mar 23 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
PHP可变函数的使用详解
Jun 14 PHP
php绘制一条直线的方法
Jan 24 PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
PHP中的常见魔术方法功能作用及用法实例
Jul 01 PHP
详谈phpAdmin修改密码后拒绝访问的问题
Apr 03 PHP
php微信开发之关键词回复功能
Jun 13 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 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生成缩略图的函数代码(修改版)
2011/01/18 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
php+mysql实现无限级分类
2015/11/11 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
PHP设计模式之单例模式定义与用法分析
2019/03/26 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
JS模块与命名空间的介绍
2013/03/22 Javascript
jQuery点击弹出下拉菜单的小例子
2013/08/01 Javascript
js选项卡的实现方法
2015/02/09 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
js实现的动画导航菜单效果代码
2015/09/10 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
Bootstrap Paginator+PageHelper实现分页效果
2018/12/29 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
python分析nignx访问日志脚本分享
2015/02/26 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
附答案的Java面试题
2012/11/19 面试题
大学生就业自我推荐信
2014/05/10 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
电工实训报告总结
2014/11/05 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
实验心得体会范文
2016/01/25 职场文书
MySQL 用 limit 为什么会影响性能
2021/09/15 MySQL