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 相关文章推荐
用Zend Encode编写开发PHP程序
Feb 21 PHP
PHP运行时强制显示出错信息的代码
Apr 20 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
Drupal读取Excel并导入数据库实例
Mar 02 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
PHP中的替代语法简介
Aug 22 PHP
详解PHP实现定时任务的五种方法
Jul 25 PHP
PHP处理bmp格式图片的方法分析
Jul 04 PHP
PHP文件管理之实现网盘及压缩包的功能操作
Sep 20 PHP
PHP 断点续传实例详解
Nov 11 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
Smarty模板配置实例简析
Jul 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简单命令代码集锦
2007/09/24 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
谈谈 PHP7新增功能
2015/12/16 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
禁用键盘上的(全局)指定键兼容iE、Chrome、火狐
2013/05/14 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
一个简单的全屏图片上下打开显示网页效果示例
2014/07/08 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
浅谈Python爬虫基本套路
2019/03/25 Python
详解python数据结构和算法
2019/04/18 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
印度服装购物网站:Limeroad
2018/09/26 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
接口可以包含哪些成员
2012/09/30 面试题
实习生自荐信范文分享
2013/11/27 职场文书
难忘的一天教学反思
2014/04/30 职场文书
幸福中国演讲稿
2014/09/12 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android