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 相关文章推荐
编译问题
Oct 09 PHP
php中count获取多维数组长度的方法
Nov 03 PHP
一个比较不错的PHP日历类分享
Nov 18 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php实现根据IP地址获取其所在省市的方法
Apr 30 PHP
php微信开发之音乐回复功能
Jun 14 PHP
Laravel5框架自定义错误页面配置操作示例
Apr 17 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
如何通过PHP实现Des加密算法代码实例
May 09 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
Jul 10 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
PHP中Header使用的HTTP协议及常用方法小结
2014/11/04 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
优化Vue中date format的性能详解
2020/01/13 Javascript
Python用UUID库生成唯一ID的方法示例
2016/12/15 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Python中矩阵创建和矩阵运算方法
2018/08/04 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
什么是python的函数体
2020/06/19 Python
Python 里最强的地图绘制神器
2021/03/01 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
如何做好总经理助理
2013/11/12 职场文书
办公室文秘岗位职责
2013/11/15 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
英语演讲开场白
2015/05/29 职场文书
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript