中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

php支持斷點續傳、分塊下載的類
來源:易賢網 閱讀:1270 次 日期:2016-08-25 15:20:29
溫馨提示:易賢網小編為您整理了“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支持斷點續傳、分塊下載的類
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲免费在线播放| 欧美精品一区二区三区高清aⅴ| 亚洲一区二区日本| 美女露胸一区二区三区| 国产精品夜色7777狼人| 亚洲日本中文字幕免费在线不卡| 羞羞漫画18久久大片| 欧美日韩国产综合久久| 国产精品久久久久久久久久免费看| 亚洲欧洲日本专区| 欧美高清视频一区| 久久人人看视频| 欧美日韩亚洲在线| 久久精品一本| 欧美精品一区二区久久婷婷 | 国产精品久久久久久久久久久久久久| 国产亚洲成av人在线观看导航 | 亚洲人成在线播放| 久久综合图片| 亚洲精品日韩久久| 欧美三区在线视频| 亚洲免费在线精品一区| 国产精品久久二区二区| 欧美亚洲一级片| 国产一区二区三区奇米久涩| 美日韩丰满少妇在线观看| 欧美日本国产视频| 国产欧美一区二区三区久久| 久久裸体视频| 日韩一级精品| 国产日韩精品在线播放| 久久精品国产精品亚洲精品| 国产最新精品精品你懂的| 欧美成人xxx| 久久久精品日韩欧美| 一本到高清视频免费精品| 国产在线视频不卡二| 久久九九热免费视频| 亚洲激情午夜| 国产一区二区三区在线观看网站| 欧美色大人视频| 久久精品女人的天堂av| 亚洲电影免费观看高清完整版在线 | 久久久久九九九九| 亚洲精品色图| 久久精品1区| 国产在线精品二区| 欧美成人一区在线| 欧美一区二区网站| 国产精品视频一区二区高潮| 亚洲精品在线看| 欧美视频在线观看一区| 午夜视频久久久久久| 亚洲国产成人精品视频 | 亚洲蜜桃精久久久久久久| 欧美日韩亚洲另类| 美女主播一区| 亚洲天堂第二页| 一区二区三区在线视频播放 | 亚洲视频在线看| 亚洲成色777777在线观看影院| 欧美日韩免费看| 久久裸体视频| 亚洲另类一区二区| 国产视频一区在线| 欧美精品免费播放| 久久精品中文字幕一区| 一本色道久久99精品综合| 极品日韩av| 国产亚洲欧洲997久久综合| 欧美日韩亚洲免费| 国产精品免费看片| 国产精品嫩草99a| 国产精品美女主播| 激情视频一区| 亚洲精品久久久久久下一站| 国产美女扒开尿口久久久| 欧美高清视频www夜色资源网| 亚洲一二三区精品| 9色精品在线| 91久久久久久久久| 91久久精品日日躁夜夜躁欧美 | 欧美日韩国产色视频| 欧美精品在线视频观看| 欧美r片在线| 欧美日韩18| 国产免费观看久久| 亚洲国产精品va在线观看黑人| 国产精品久久久久久久久久妞妞| 欧美精彩视频一区二区三区| 另类酷文…触手系列精品集v1小说| 久久精品91| 欧美男人的天堂| 国产精品青草久久| 亚洲国产精品一区在线观看不卡 | 国产视频精品xxxx| 国产精品嫩草久久久久| 国产精品专区一| 在线视频精品一| 久久九九免费| 国产精品夜夜夜一区二区三区尤| 免费欧美高清视频| 欧美激情成人在线| 欧美日韩情趣电影| 国产精品久久久一区二区三区| 国产精品一区二区在线观看不卡 | 亚洲欧美日韩国产一区| 欧美福利精品| 亚洲国产导航| 久久视频精品在线| 国产欧美一区二区精品性| 亚洲二区视频| 亚洲免费视频在线观看| 欧美在线www| 国产精品国产馆在线真实露脸 | 亚洲免费观看| 麻豆freexxxx性91精品| 在线观看不卡| 香蕉成人伊视频在线观看| 欧美吻胸吃奶大尺度电影| 亚洲精品免费一二三区| 久久免费视频网| 国产网站欧美日韩免费精品在线观看| 亚洲日本免费| 欧美国产丝袜视频| 伊人久久亚洲影院| 久久国产精品久久久久久久久久| 欧美日本一道本在线视频| 精品99一区二区三区| 欲色影视综合吧| 亚洲激情一区| 久久精品一区四区| 国产香蕉97碰碰久久人人| 亚洲一区二区高清| 国产精品入口| 欧美激情综合五月色丁香小说| 亚洲毛片av| 国产欧美日韩一区二区三区| 亚洲女同精品视频| 国产精品久久999| 精品99一区二区| 欧美不卡一卡二卡免费版| 国产噜噜噜噜噜久久久久久久久| 亚洲免费大片| 欧美日韩免费| 久久免费精品视频| 日韩亚洲不卡在线| 国产亚洲欧美一区在线观看| 欧美一区二区三区四区视频| 日韩午夜在线| 欧美日韩精品在线播放| 99亚洲视频| 国产精品久久久久一区二区三区共| 99re66热这里只有精品3直播| 欧美成人精品h版在线观看| 亚洲精品一二区| 国产精品入口| 性做久久久久久久免费看| 国产精品国产三级国产aⅴ无密码| 亚洲视频国产视频| 在线看欧美视频| 欧美人成免费网站| 欧美一级精品大片| 尤妮丝一区二区裸体视频| 蜜臀av性久久久久蜜臀aⅴ| 午夜精品久久| 中文有码久久| 欧美亚洲一区三区| 91久久夜色精品国产九色| 国产欧美一级| 欧美日韩国产色综合一二三四| 亚洲欧美中文日韩v在线观看| 国产综合18久久久久久| 欧美精品乱码久久久久久按摩| 久久国产精品黑丝| 久久噜噜噜精品国产亚洲综合| 久久久久久久网| 六月丁香综合| 午夜在线观看欧美| 一本不卡影院| 一区二区三区免费在线观看| 伊人成年综合电影网| 国产欧美日本一区二区三区| 国产精品播放| 国产欧美日韩免费看aⅴ视频| 精品999在线播放| 中文高清一区| 亚洲综合电影一区二区三区| 日韩一区二区精品| 亚洲性图久久| 亚洲免费影视第一页| 亚洲欧美在线播放| 另类激情亚洲| 欧美日韩伦理在线免费| 国产日本欧美一区二区三区| 国产日韩av在线播放| 亚洲国产女人aaa毛片在线| 亚洲国产高清aⅴ视频| 在线观看精品视频| 亚洲人成网站影音先锋播放|