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 Session变量不能传送到下一页的解决方法
Nov 27 PHP
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
php树型类实例
Dec 05 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
PHP的命令行命令使用指南
Aug 18 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
Laravel框架表单验证操作实例分析
Sep 30 PHP
PHP后门隐藏的一些技巧总结
Nov 04 PHP
php中使用array_filter()函数过滤数组实例讲解
Mar 03 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
yii操作session实例简介
2014/07/31 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
js宝典学习笔记(上)
2007/01/10 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
javascript各浏览器中option元素的表现差异
2011/04/07 Javascript
javascript操作css属性
2013/12/30 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
简单了解常用的JavaScript 库
2020/07/16 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
python模块之re正则表达式详解
2017/02/03 Python
解析Python的缩进规则的使用
2019/01/16 Python
python中import与from方法总结(推荐)
2019/03/21 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
python中rb含义理解
2020/06/18 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
基于HTML5 audio元素播放声音jQuery小插件
2011/05/11 HTML / CSS
日本最大级玩偶手办购物:あみあみ Amiami
2018/04/23 全球购物
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
整改通知书
2015/04/20 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL