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 相关文章推荐
使用eAccelerator加密PHP程序
Oct 03 PHP
php 分页原理详解
Aug 21 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
获取远程文件大小的php函数
Jan 11 PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 PHP
Zend的AutoLoad机制介绍
Sep 27 PHP
基于php权限分配的实现代码
Apr 28 PHP
php不写闭合标签的好处
Mar 04 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
谈谈php对接芝麻信用踩的坑
Dec 01 PHP
PHP中关于php.ini参数优化详解
Feb 28 PHP
用php实现分页效果的示例代码
Dec 10 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读取excel文件的简单实例
2013/08/26 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
SlideView 图片滑动(扩展/收缩)展示效果
2010/08/01 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
电气工程师岗位职责
2014/01/01 职场文书
人事专员工作职责
2014/02/22 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
工人先锋号申报材料
2014/12/29 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
争做文明公民倡议书
2019/06/24 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
Django实现聊天机器人
2021/05/31 Python
Python软件包安装的三种常见方法
2022/07/07 Python