PHP断点续传的原理与实现

PHP断点续传的原理与实现

断点续传主要是HTTP协议中的Content-Range报头。其理解如下:

Content-Range:响应资源的范围。可以在多次请求中标记请求的资源范围,在连接断开重新连接时,客户端只请求该资源未被下载的部分,而不是重新请求整个资源,实现了断点续传。迅雷就是基于这个原理,使用多线程分段读取网络上的资源,最后合并。关于PHP使用多线程实现断点续传稍后讨论。本文只实现简单的断点续传。

代码实现:

先定义一个函数  getRange() 这个函数用来处理  header中 Range 具体数据的处理

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

假设文件的地址为 $file_path

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

文章参考自:http://www.cnblogs.com/xyxiong/archive/2011/02/16/1956167.html

时间: 2024-08-29 05:04:43

PHP断点续传的原理与实现的相关文章

Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简单说一个进程可以由多个线程组成,一个操作系统可以多个进程,它们都是可以同时进行工作的. 2.什么是下载?如何多线程进行下载?如何断点续传? 广义上说,凡是在屏幕上看到的不属于本地计算机上的内容,皆是通过"下载"得来.狭义上人们只认为那些自定义了下载文件的本地磁盘存储位置的操作才是"

客户端HTTP断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已. 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:假设服务器域名为wwww.scu.edu.cn,文件名为down.zip.GET /down.zip HTTP/1.1Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.m

断点续传的原理(转)

断点续传的原理(转)[@[email protected]]zt from http://www.chinajavaworld.com (一)断点续传的原理 其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已. 打个比方,浏览器请求服务器上的一个文时,所发出的请求如下: 假设服务器域名为www.sjtu.edu.cn,文件名为down.zip. GET /down.zip HTTP/1.1 Accept:image/gif, image/x-xbitmap, image/j

断点续传下载原理实现

需求背景 动态创建的文件下载的时候希望浏览器显示下载进度 动态创建的文件希望能够分段下载 HTTP断点续传报文 要实现HTTP断点续传必须要简单了解以下几个报文. Accept-Ranges 告诉客户端(浏览器..)服务器端支持断点续传 服务器端返回 Range 客户端告诉服务器端从指定的的位置/范围(这里值字节数)下载资源 客户端发出 Content-Range 服务器端告诉客户端响应的数据信息,在整个返回体中本部分的字节位置 服务器端返回 ETag 资源标识 非必须 服务器端返回 Last-

Java断点续传实现原理很简单

原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料.但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少. 于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来.但初学时这样做其实很显然是有好有坏的. 好处在于,源码很多,解释很少:如果我们肯下功

HTTP文件断点续传的原理

前几天一个同事跑过来找我说,我们在广告素材视频这块想做断点续传,就是这次某个视频缓存到一半,下次不用重头开始,可以在原来停留得位置开始继续下载.以提供更好的用户体验. 同时说需要我们支持吐素材地址的业务接口告诉终端最后修改时间/文件签名(md5),用这个用来判断我当前要下的文件有没有变化,同时告诉终端文件的Size大小. 我一细想,这个问题压根不需要通过改变现有接口提供更多的数据来做.下面从原理实现上简单说下: 关键点: 对于断点续传,关键点是两个: 1. 终端知道当前的文件和上一次加载的文件是

QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)

//功能:    根据一个URL地址将数据保存到指定路径下,支持断点续传//参数:    url            --需要访问的URL地址//         SavePath       --需要保存的路径//DownedSize 已经下载的大小// totalSize 文件总大小//返回值:  ture --成功 false --失败bool HttpGet::DownFile(const QUrl &url,const QString &SavePath,int DownedS

很简单的Java断点续传实现原理

原理解析 在开发当中,"断点续传"这种功能很实用和常见,听上去也是比较有"逼格"的感觉.所以通常我们都有兴趣去研究研究这种功能是如何实现的? 以Java来说,网络上也能找到不少关于实现类似功能的资料.但是呢,大多数都是举个Demo然后贴出源码,真正对其实现原理有详细的说明很少. 于是我们在最初接触的时候,很可能就是直接Crtl + C/V代码,然后捣鼓捣鼓,然而最终也能把效果弄出来.但初学时这样做其实很显然是有好有坏的. 好处在于,源码很多,解释很少:如果我们肯下功

Android多线程断点续传下载原理及实现

这段时间看了看工作室的工具库的下载组件,发现其存在一些问题: 1.下载核心逻辑有 bug,在暂停下载或下载失败等情况时有概率无法顺利完成下载.2.虽然原来的设计是采用多线程断点续传的设计,但打了一下日志发现其实下载任务都是在同一个线程下串行执行,并没有起到加快下载速度的作用. 考虑到原来的代码并不复杂,因此对这部分下载组件进行了重写.这里记录一下里面的多线程断点续传功能的实现. 请查看完整的PDF版(更多完整项目下载.未完待续.源码.图文知识后续上传github.)可以点击关于我联系我获取完整P