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 移除数组重复元素的一点说明
Nov 27 PHP
PHP 彩色文字实现代码
Jun 29 PHP
php操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
深入PHP5中的魔术方法详解
Jun 17 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
Nov 21 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
基于laravel where的高级使用方法
Oct 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
第十一节 重载 [11]
2006/10/09 PHP
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
2015/04/15 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
浅谈javascript 函数内部属性
2015/01/21 Javascript
jQuery中$.each使用详解
2015/01/29 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python概率计算器实例分析
2015/03/25 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
实用自动化运维Python脚本分享
2018/06/04 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python 实现list或string按指定分段
2019/12/25 Python
python输出pdf文档的实例
2020/02/13 Python
香港演唱会订票网站:StubHub香港
2019/10/10 全球购物
骨干教师申报材料
2014/12/17 职场文书
redis数据结构之压缩列表
2022/03/21 Redis
MySQL数据库简介与基本操作
2022/05/30 MySQL