PHP断点续传的原理与实现

WBOY
发布: 2016-06-23 13:36:21
原创
1137 人浏览过

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


来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板