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 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
Sep 05 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 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中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
动态加载jQuery的方法
2015/06/16 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
2016/12/09 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
vue 项目build错误异常的解决方法
2019/04/22 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
Mac安装python3的方法步骤
2019/08/09 Python
python如何调用字典的key
2020/05/25 Python
Python同时迭代多个序列的方法
2020/07/28 Python
python用Tkinter做自己的中文代码编辑器
2020/09/07 Python
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
进口业务员岗位职责
2014/04/06 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
甘南现象心得体会
2014/09/11 职场文书
三孔导游词
2015/02/05 职场文书
2015年司法所工作总结
2015/04/27 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
初中英语教学随笔
2015/08/15 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
创业计划书之服装
2019/10/07 职场文书
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android