解析php多线程下载远程多个文件


Posted in PHP onJune 25, 2013
function remote($urls, $name = '', $path = '', $dir = './images/') {
 if (!is_array($urls) or count($urls) == 0) {
  return false;
 }
 dmkdir($dir);
 $curl = $text = array();
 foreach($urls as $k => $v) {
  if (!empty($v) && preg_match("~^http~i", $v)) {
   $nurl[$k] = trim(str_replace(' ', "%20", $v));
   $curl[$k] = curl_init($nurl[$k]);
   curl_setopt($curl[$k], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
   curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($curl[$k], CURLOPT_HEADER, 0);
   curl_setopt($curl[$k], CURLOPT_CONNECTTIMEOUT, 20);
   if(!isset($handle)){
    $handle = curl_multi_init();
   }
   curl_multi_add_handle($handle, $curl[$k]);
  }
  continue ;
 }
 $active = null;
 do{
  $mrc = @curl_multi_exec($handle, $active);
 } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 while ($active && $mrc == CURLM_OK) {
  if (curl_multi_select($handle) != -1) {
   do {
    $mrc = curl_multi_exec($handle, $active);
   } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
 }
 foreach ($curl as $k => $v) {
   if (curl_error($curl[$k]) == "") {
    if ($k == 0) {
     $fname[$k] = strtolower($name . '.' . pathinfo($urls[$k], PATHINFO_EXTENSION));
    } else {
     $fname[$k] = strtolower($name . '_' . $k . '.' . pathinfo($urls[$k], PATHINFO_EXTENSION));
    }
    $text[$k] = (string) curl_multi_getcontent($curl[$k]);
    $filedir[$k] = $dir.'/' . $fname[$k];
   if (file_put_contents($filedir[$k], $text[$k])) {
    $filepath[$k] = $path . $fname[$k];
   }
  }
  curl_multi_remove_handle($handle, $curl[$k]);
  curl_close($curl[$k]);
 }
 curl_multi_close($handle);
 return $filepath;
}

PHP 相关文章推荐
PHP 日期加减的类,很不错
Oct 10 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
php查找字符串出现次数的方法
Dec 01 PHP
php实现递归与无限分类的方法
Feb 16 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
php生成图片验证码-附五种验证码
Aug 19 PHP
php限制文件下载速度的代码
Oct 20 PHP
学习php设计模式 php实现门面模式(Facade)
Dec 07 PHP
PHP环形链表实现方法示例
Sep 15 PHP
php实现的rc4加密解密类定义与用法示例
Aug 16 PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 #PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
Jun 25 #PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 #PHP
使用php判断网页是否gzip压缩
Jun 25 #PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
Jun 25 #PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 #PHP
提升PHP性能的21种方法介绍
Jun 25 #PHP
You might like
一个php作的文本留言本的例子(五)
2006/10/09 PHP
php防盗链的常用方法小结
2010/07/02 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
原生js实现自由拖拽弹窗代码demo
2016/06/29 Javascript
浅谈JS 数字和字符串之间相互转化的纠纷
2017/10/20 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
2018/03/12 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
JavaScript this在函数中的指向及实例详解
2019/10/14 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
vue中利用iscroll.js解决pc端滚动问题
2020/02/15 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
详解Python命令行解析工具Argparse
2016/04/20 Python
Python模拟登陆实现代码
2017/06/14 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
机电专业大学生求职信
2013/10/04 职场文书
高中学生期末评语
2014/04/25 职场文书
设计师求职信模板
2014/05/06 职场文书
大学生个人求职信
2014/06/02 职场文书
双拥工作宣传标语
2014/06/26 职场文书
本科毕业生应聘求职信
2014/07/06 职场文书
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang