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

 更新时间:2013年06月25日 17:07:53   作者:  
本篇文章是对php多线程下载远程多个文件的方法进行了详细的分析介绍,需要的朋友参考下
复制代码 代码如下:

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 fgetcsv 定义和用法(附windows与linux下兼容问题)

    PHP fgetcsv 定义和用法(附windows与linux下兼容问题)

    PHP fgetcsv() 函数从文件指针中读入一行并解析 CSV 字段。与PHP fgets() 类似,不同的是 PHP fgetcsv() 解析读入的行并找出 CSV 格式的字段,然后返回一个包含这些字段的数组
    2012-05-05
  • 浅析PHP程序设计中的MVC编程思想

    浅析PHP程序设计中的MVC编程思想

    这篇文章主要介绍了PHP程序设计中的MVC编程思想,对于深入理解MVC程序设计思想有一定的帮助,需要的朋友可以参考下
    2014-07-07
  • PHP实现Unicode编码相互转换的方法示例

    PHP实现Unicode编码相互转换的方法示例

    这篇文章主要介绍了PHP实现Unicode编码相互转换的方法,结合实例形式分析了Unicode编码与解码的相关实现与使用技巧,需要的朋友可以参考下
    2017-04-04
  • Laravel 5.3 学习笔记之 安装

    Laravel 5.3 学习笔记之 安装

    本文是Laravel 5.3 学习笔记系列文章的第一篇,我们来加单讲解下Laravel 5.3 的安装,有需要的小伙伴可以参考下
    2016-08-08
  • thinkphp6中Redis 的基本使用方法详解

    thinkphp6中Redis 的基本使用方法详解

    这篇文章主要介绍了thinkphp6中Redis 的基本使用方法,结合实例形式详细讲述了redis的安装、配置、以及thinkphp6操作redis的基本实现技巧与相关注意事项,需要的朋友可以参考下
    2023-06-06
  • PHP实现抽奖系统的示例代码

    PHP实现抽奖系统的示例代码

    这篇文章主要为大家介绍了如何利用PHP实现三种不同的抽奖算法:随机抽奖、概率抽奖和内定抽奖,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-06-06
  • php设计模式 Template (模板模式)

    php设计模式 Template (模板模式)

    定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构可以定义该算法的某些特定步骤
    2011-06-06
  • phpstorm编辑器乱码问题解决

    phpstorm编辑器乱码问题解决

    这篇文章主要介绍了phpstorm编辑器乱码问题的解决方案,非常的实用,给需要的小伙伴们参考下。
    2014-12-12
  • php常用数学函数汇总

    php常用数学函数汇总

    这篇文章主要介绍了php常用数学函数,以实例形式汇总了常用数学函数的定义及用法实例,具有不错的学习与借鉴价值,需要的朋友可以参考下
    2014-11-11
  • str_replace只替换一次字符串的方法

    str_replace只替换一次字符串的方法

    我们都知道,在PHP里Strtr,strreplace等函数都可以用来替换,不过他们每次替换的时候都是全部替换,但是如果你想只替换一个或两个怎么办呢?看下边的解决方法
    2013-04-04

最新评论