侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

php支持断点续传、分块下载的类

php  /  管理员 发布于 7年前   402

本文是为大家分享php支持断点续传、分块下载的类,供大家参考,具体内容如下

 '*/*',      'User-Agent'   => 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',      'Accept-Encoding' => 'gzip, deflate',      'Host'      => $url_info['host'],      'Connection'   => 'Close',      'Accept-Language' => 'zh-cn',    );     // merge heade    $headers = array_merge($def_headers, $headers);    // get content length    $content_length = self::get_content_size($url_info['host'], $url_info['port'], $url_info['request'], $headers, $timeout);     // content length not exist    if (!$content_length) {      throw new Exception('Content-Length is Not Exists');    }    // get exists length    $exists_length = is_file($save_file) ? filesize($save_file) : 0;    // get tmp data file    $data_file = $save_file . '.data';    // get tmp data    $exists_data = is_file($data_file) ? json_decode(file_get_contents($data_file), 1) : array();    // check file is valid    if ($exists_length == $content_length) {      $exists_data && @unlink($data_file);      return true;    }    // check file is expire    if ($exists_data['length'] != $content_length || $exists_length > $content_length) {      $exists_data = array(        'length' => $content_length,      );    }    // write exists data    file_put_contents($data_file, json_encode($exists_data));     try {      $download_status = self::download_content($url_info['host'], $url_info['port'], $url_info['request'], $save_file, $content_length, $exists_length, $speed, $headers, $timeout);      if ($download_status) {        @unlink($data_file);      }    } catch (Exception $e) {      throw new Exception($e->getMessage());    }    return true;  }   /**   * parse url   *   * @param $url   * @return bool|mixed   */  static function parse_url($url) {    $url_info = parse_url($url);    if (!$url_info['host']) {      return false;    }    $url_info['port']  = $url_info['port'] ? $url_info['host'] : 80;    $url_info['request'] = $url_info['path'] . ($url_info['query'] ? '?' . $url_info['query'] : '');    return $url_info;  }   /**   * download content by chunk   *   * @param $host   * @param $port   * @param $url_path   * @param $headers   * @param $timeout   */  static function download_content($host, $port, $url_path, $save_file, $content_length, $range_start, $speed, &$headers, $timeout) {    $request = self::build_header('GET', $url_path, $headers, $range_start);    $fsocket = @fsockopen($host, $port, $errno, $errstr, $timeout);    stream_set_blocking($fsocket, TRUE);    stream_set_timeout($fsocket, $timeout);    fwrite($fsocket, $request);    $status = stream_get_meta_data($fsocket);    if ($status['timed_out']) {      throw new Exception('Socket Connect Timeout');    }    $is_header_end = 0;    $total_size  = $range_start;    $file_fp    = fopen($save_file, 'a+');    while (!feof($fsocket)) {      if (!$is_header_end) {        $line = @fgets($fsocket);        if (in_array($line, array("\n", "\r\n"))) {          $is_header_end = 1;        }        continue;      }      $resp    = fread($fsocket, $speed);      $read_length = strlen($resp);      if ($resp === false || $content_length < $total_size + $read_length) {        fclose($fsocket);        fclose($file_fp);        throw new Exception('Socket I/O Error Or File Was Changed');      }      $total_size += $read_length;      fputs($file_fp, $resp);      // check file end      if ($content_length == $total_size) {        break;      }      sleep(1);      // for test      //break;    }    fclose($fsocket);    fclose($file_fp);    return true;   }   /**   * get content length   *   * @param $host   * @param $port   * @param $url_path   * @param $headers   * @param $timeout   * @return int   */  static function get_content_size($host, $port, $url_path, &$headers, $timeout) {    $request = self::build_header('HEAD', $url_path, $headers);    $fsocket = @fsockopen($host, $port, $errno, $errstr, $timeout);    stream_set_blocking($fsocket, TRUE);    stream_set_timeout($fsocket, $timeout);    fwrite($fsocket, $request);    $status = stream_get_meta_data($fsocket);    $length = 0;    if ($status['timed_out']) {      return 0;    }    while (!feof($fsocket)) {      $line = @fgets($fsocket);      if (in_array($line, array("\n", "\r\n"))) {        break;      }      $line = strtolower($line);      // get location      if (substr($line, 0, 9) == 'location:') {        $location = trim(substr($line, 9));        $url_info = self::parse_url($location);        if (!$url_info['host']) {          return 0;        }        fclose($fsocket);        return self::get_content_size($url_info['host'], $url_info['port'], $url_info['request'], $headers, $timeout);      }      // get content length      if (strpos($line, 'content-length:') !== false) {        list(, $length) = explode('content-length:', $line);        $length = (int)trim($length);      }    }    fclose($fsocket);    return $length;   }   /**   * build header for socket   *   * @param   $action   * @param   $url_path   * @param   $headers   * @param int $range_start   * @return string   */  static function build_header($action, $url_path, &$headers, $range_start = -1) {    $out = $action . " {$url_path} HTTP/1.0\r\n";    foreach ($headers as $hkey => $hval) {      $out .= $hkey . ': ' . $hval . "\r\n";    }    if ($range_start > -1) {      $out .= "Accept-Ranges: bytes\r\n";      $out .= "Range: bytes={$range_start}-\r\n";    }    $out .= "\r\n";     return $out;  }}  #use age/*try {  if (downloader::get('http://dzs.aqtxt.com/files/11/23636/201604230358308081.rar', 'test.rar')) {    //todo    echo 'Download Succ';  }} catch (Exception $e) {  echo 'Download Failed';}*/?>

以上就是本文的全部内容,希望对大家的学习有所帮助。

您可能感兴趣的文章:

  • php断点续传之如何分割合并文件
  • 解决PHP超大文件下载,断点续传下载的方法详解
  • php实现的支持断点续传的文件下载类
  • php下载远程文件类(支持断点续传)
  • PHP实现HTTP断点续传的方法
  • php断点续传之文件分割合并详解
  • 关于php支持分块与断点续传文件下载功能代码
  • php+resumablejs实现的分块上传 断点续传功能示例
  • PHP简单实现断点续传下载的方法
  • PHP实现断点续传乱序合并文件的方法


  • 上一条:
    php实现按天数、星期、月份查询的搜索框
    下一条:
    php数组分页实现方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客