亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php支持斷點續傳、分塊下載的類

2024-05-04 23:45:22
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了php支持斷點續傳、分塊下載的類的相關資料,需要的朋友可以參考下
 

本文是為大家分享php支持斷點續傳、分塊下載的類,供大家參考,具體內容如下

<?php /** * User: djunny * Date: 2016-04-29 * Time: 17:18 * Mail: 199962760@qq.com * 支持斷點下載的類 */class downloader {   /**   * download file to local path   *   * @param    $url   * @param    $save_file   * @param int  $speed   * @param array $headers   * @param int  $timeout   * @return bool   * @throws Exception   */  static function get($url, $save_file, $speed = 10240, $headers = array(), $timeout = 10) {    $url_info = self::parse_url($url);    if (!$url_info['host']) {      throw new Exception('Url is Invalid');    }     // default header    $def_headers = array(      'Accept'     => '*/*',      '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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产一区二区三区久久久狼| 国产精品一区二区av影院萌芽| 国产精品入口日韩视频大尺度| 97久久伊人激情网| 亚洲天堂免费视频| 最近2019免费中文字幕视频三| 欧美大片在线看| 日本国产高清不卡| 91人成网站www| 亚洲欧美精品伊人久久| 宅男66日本亚洲欧美视频| 91影院在线免费观看视频| 亚洲日本成人女熟在线观看| 亚洲人av在线影院| 欧美国产中文字幕| 亚洲成成品网站| 精品日韩美女的视频高清| 中文字幕日韩电影| 91国偷自产一区二区三区的观看方式| 亚洲国产天堂网精品网站| 欧美乱大交做爰xxxⅹ性3| 国产视频欧美视频| 中文在线资源观看视频网站免费不卡| 91av在线播放| 亚洲香蕉伊综合在人在线视看| 国产69精品久久久| 成人免费午夜电影| 亚洲一区二区三区xxx视频| 在线观看精品自拍私拍| 国产欧美va欧美va香蕉在线| 精品国产999| 久久精品国产亚洲精品2020| 亚洲精品国产电影| 欧美性xxxx极品高清hd直播| 亚洲视频一区二区| 久久国产精品久久久| 亚洲精品免费网站| 久久久精品久久久| 国产精品视频内| 久久精品亚洲热| 欧美极度另类性三渗透| 91在线观看免费观看| 欧美激情亚洲视频| 国产精品欧美日韩久久| 欧美国产视频日韩| 欧美日韩免费在线| 精品久久久久国产| 欧美成人三级视频网站| 92版电视剧仙鹤神针在线观看| 亚洲精品国精品久久99热一| 成人网址在线观看| 伊人久久大香线蕉av一区二区| 日韩美女在线观看| 中文字幕欧美日韩在线| 91经典在线视频| 一本色道久久综合狠狠躁篇的优点| 中文字幕日韩有码| 亚洲欧美日韩爽爽影院| 欧美激情一级精品国产| 美乳少妇欧美精品| 国产91对白在线播放| 日韩美女在线播放| 国产精品你懂得| 欧美性xxxx极品高清hd直播| 美女av一区二区三区| 欧美激情按摩在线| 日韩电影中文字幕一区| 欧美激情按摩在线| 国产这里只有精品| 亚洲成人久久久久| 亚洲va久久久噜噜噜| 亚洲精品ady| 欧美激情第99页| 成人免费在线视频网址| 久久久久久久色| 日韩成人av一区| 国产亚洲成精品久久| 久久精品国产成人| 狠狠躁天天躁日日躁欧美| 欧美高清视频在线观看| 91在线精品视频| 最近2019中文免费高清视频观看www99| 一区二区成人av| 日韩久久精品成人| 亚洲女人被黑人巨大进入| 国产精品专区一| 国产亚洲一区精品| 日韩专区在线观看| 久久国产天堂福利天堂| 久久久综合av| 亚洲精品久久久久| 91久久久久久久久久久| 色婷婷av一区二区三区久久| 日韩av男人的天堂| 欧美日韩美女在线| 亚洲男女自偷自拍图片另类| 日韩亚洲综合在线| 日韩av有码在线| 亚洲国产福利在线| 精品国产精品自拍| 高跟丝袜欧美一区| 欧美黑人性生活视频| 国产欧美一区二区三区久久| 在线观看久久久久久| 亚洲第一网站免费视频| 亚洲最大成人免费视频| 久久久久久久国产精品| 亚洲va欧美va国产综合剧情| 国产精品va在线| 国产午夜精品久久久| 久久精品国产亚洲精品| 日韩经典中文字幕| 欧美日韩一区二区三区在线免费观看| 4438全国亚洲精品在线观看视频| 中文字幕亚洲欧美在线| 日韩中文第一页| 亚洲人成在线电影| 日av在线播放中文不卡| 国产精品毛片a∨一区二区三区|国| 成人免费观看网址| 亚洲欧美另类自拍| 亚洲综合中文字幕在线观看| 狠狠躁18三区二区一区| 国产一区二区三区在线观看视频| 欧美性xxxx极品hd欧美风情| 成人免费观看a| 欧美精品videosex性欧美| 中文字幕在线看视频国产欧美在线看完整| 亚洲人成在线一二| 国产精品国产三级国产专播精品人| 欧美另类精品xxxx孕妇| 国产精品三级久久久久久电影| 亚洲成人av中文字幕| 欧美黄网免费在线观看| 久久久精品在线| 国产在线观看91精品一区| 精品视频www| 黑人与娇小精品av专区| 欧美午夜片在线免费观看| 成人网页在线免费观看| 国产精品一区二区三区久久久| 欧美日韩中文字幕日韩欧美| 成人xxxx视频| 欧美精品www| 日韩av中文字幕在线免费观看| 日韩欧美亚洲一二三区| 亚洲第一页中文字幕| 亚洲一品av免费观看| 日韩va亚洲va欧洲va国产| 国产精品一区二区三区免费视频| 欧美黑人巨大精品一区二区| 97视频网站入口| 久久成人人人人精品欧| 久久久久久久一区二区三区| 欧美成人合集magnet| 国产精品久久久久久久美男| 日韩中文字幕在线观看| 亚洲欧美另类在线观看| 亚洲精品视频久久| 国产精品高潮呻吟久久av野狼| 欧美激情视频三区| 亚洲综合在线播放| 欧美一区深夜视频| 97人人爽人人喊人人模波多|