茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類
    來源:易賢網(wǎng) 閱讀:1152 次 日期:2016-08-25 15:20:29
    溫馨提示:易賢網(wǎng)小編為您整理了“php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類”,方便廣大網(wǎng)友查閱!

    本文是為大家分享php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類,供大家參考,具體內(nèi)容如下

    <?php

    /**

     * User: djunny

     * Date: 2016-04-29

     * Time: 17:18

     * Mail: 199962760@qq.com

     * 支持?jǐn)帱c(diǎn)下載的類

     */

    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';

    }

    */

    ?>

    以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:php支持?jǐn)帱c(diǎn)續(xù)傳、分塊下載的類
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026國考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)