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 从数据库提取二进制图片的处理代码
Sep 09 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
用Zend Studio+PHPnow+Zend Debugger搭建PHP服务器调试环境步骤
Jan 19 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP+Mysql基于事务处理实现转账功能的方法
Jul 08 PHP
smarty简单应用实例
Nov 03 PHP
PHP读取PPT文件的方法
Dec 10 PHP
php 如何获取文件的后缀名
Jun 05 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
Jun 08 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 常用算法和时间复杂度
2013/07/01 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php 利用socket发送HTTP请求(GET,POST)
2015/08/24 PHP
php将print_r处理后的数据还原为原始数组的解决方法
2016/11/02 PHP
PHP中overload与override的区别
2017/02/13 PHP
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
js取得url地址参数实例
2013/02/22 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
大转盘抽奖小程序版 转盘抽奖网页版
2020/04/16 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python秒算24点实现及原理详解
2019/07/29 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
python实现最速下降法
2020/03/24 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
Data URI scheme详解和使用实例及图片base64编码实现方法
2014/05/08 HTML / CSS
适用于所有创业者的创业计划书
2014/02/05 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
计算机毕业生自荐信
2014/06/12 职场文书
新课程改革心得体会
2016/01/22 职场文书
数学复习课教学反思
2016/02/18 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB