PHP断点续传的原理与实现

2017-05-27编程教程
83

断点续传主要是HTTP协议中的Content-Range报头。其理解如下:
Content-Range:响应资源的范围。可以在多次请求中标记请求的资源范围,在连接断开重新连接时,客户端只请求该资源未被下载的部分,而不是重新请求整个资源,实现了断点续传。迅雷就是基于这个原理,使用多线程分段读取网络上的资源,最后合并。关于PHP使用多线程实现断点续传稍后讨论。本文只实现简单的断点续传。
代码实现:
先定义一个函数  getRange() 这个函数用来处理  header中 Range 具体数据的处理

<span style="font-family:FangSong_GB2312;font-size:14px;"><span style="font-family:FangSong_GB2312;font-size:14px;">/** $file_size  文件大小 */
      functiongetRange($file_size){
     $range =isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null;
    if(!empty($range)){
         $range =preg_replace('/[\s|,].*/', '', $range);
          $range =explode('-',substr($range,6));
          if(count($range) < 2 ) {
             $range[1] = $file_size;
          }
         $range =array_combine(array('start','end'),$range);
         if(empty($range['start'])) {
            $range['start'] = 0;
         }
         if (!isset($range['end']) || empty($range['end'])) {
            $range['end'] = $file_size;
         }
         return$range;
     }
     return null;
  }

 </span></span>



假设文件的地址为 $file_path

<span style="font-family:FangSong_GB2312;font-size:14px;"><span style="font-family:FangSong_GB2312;font-size:14px;">$speed = 512;//此参数为下载最大速度
  $pos =strrpos($file_path, "/");
   $file_name =substr($file_path, $pos+1);
  $file_size =filesize($file_path);
  $ranges =getRange($file_size);
  $fh =  fopen($file_path, "rb");
 header('Cache-control: public');
 header('Content-Type: application/octet-stream');
 header('Content-Disposition: attachment; filename='.$file_name);
 if ($ranges !=null) {
    header('HTTP/1.1 206 Partial Content');
    header('Accept-Ranges: bytes');
    header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start']));
    header(sprintf('Content-Range: bytes %s-%s/%s', $ranges['start'],$ranges['end'], $file_size));
     fseek($fh,sprintf('%u',$ranges['start']));
 }else{
    header("HTTP/1.1 200 OK");
     header(sprintf('Content-Length:%s', $file_size));
 }
 while(!feof($fh))
 {
     echo  fread($fh, round($speed*1024, 0));
     ob_flush();
     sleep(1);
 }
 ($fh != null)&& fclose($fh);
 </span></span>

The End

相关推荐

layui根据百度地图经纬度在弹出层中显示位置
首先你需要引入百度地图的js script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0ak=你的ak"/script ak ,注意是要浏览器端的ak,这个直接到百度开发者平台申请。 引入layui,这个大家可以到layui官网看看怎么引入layer, 注意:这里要提...
2025-01-09 编程教程
240

C#之socket编程
编程需要恒心和毅力,最主要的是要有信心,循序渐进的完成任务。 一、socket类用于网络通信 命名空间System.Net.Sockets,完整的类引用System.Net.Sockets.Socket。Socket类支持各种网络协议。 二、简单的控制台程序 using System;using System.Collections....
2023-03-07 编程教程
114

百度UEditor编辑器如何禁止过滤div等网页html标签
将设计排版好的页面html代码上传到数据库,再读取出来的时候发现所有的div都被替换成了p标签。 解决方法: 首先在ueditor.all.js文件内搜索allowDivTransToP,找到如下的代码,将true设置为false me.setOpt({ 'allowDivTransToP':false, 'disabledTableInTable'...
2022-11-23 编程教程
495

Ajax中文传值出现乱码的解决办法
Ajax技术的核心为Javascript,而javascript使用的是UTF-8编码,因此在页面采用GBK或者其他编码,同时没有进行编码转换时,就会出现中文乱码的问题。 以下是分别使用GET和POST方式传值,并且页面采用GBK和UTF-8编码在IE和FF下的不同测试结果和出现乱码时的解...
2022-11-19 编程教程
364

PHP错误Warning: Cannot modify header information - headers alr
今天在用php进行图片保存输出时候,图片一直显示错误,后面用调试模式下提示:Warning: Cannot modify header information - headers already sent by... 看了一些网上的方法也没解决,最后在php.ini配置output_buffering默认为4096就没有遇到这个错误了: o...
2022-05-18 编程教程
69

Parse error: syntax error, unexpected '&'解决办法
在使用PHP5.4及以上版本时,在调用函数时,使用引用符号时,会出现Parse error: syntax error, unexpected 或PHP Fatal error: Call-time pass-by-reference has been removed者,这是由于在函数调用时通过引用传递参数已被弃用,因为它影响了代码的整洁,如...
2022-05-11 编程教程
295