解析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 09 PHP
php cookie 登录验证示例代码
Mar 16 PHP
php 获取本机外网/公网IP的代码
May 09 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
Oct 08 PHP
php in_array() 检查数组中是否存在某个值详解
Nov 23 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
浅析javascript的间隔调用和延时调用
2014/11/12 Javascript
JavaScript中reduce()方法的使用详解
2015/06/09 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
详解Angular 4.x NgTemplateOutlet
2017/05/24 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
Python中return语句用法实例分析
2015/08/04 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
基于FME使用Python过程图解
2020/05/13 Python
彻底解决Python包下载慢问题
2020/11/15 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
应聘编辑职位自荐信范文
2014/01/05 职场文书
付款委托书范本
2014/04/04 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
协会周年庆活动方案
2014/08/26 职场文书
教师创先争优承诺书
2015/04/27 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
推广普通话主题班会
2015/08/17 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS
goland 清除所有的默认设置操作
2021/04/28 Golang
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers