下面我们来介绍一下关于php实现断点续传的代码,有需要学习的朋友可参考一下。
让PHP下载代码支持断点续传 主要靠的 HTTP协议中header Content-Range来实现
先来说说 HTTP的下载原理
对于HTTP协议,向服务器请求某个文件时,只要发送类似如下的请求即可:
代码如下 | 复制代码 |
GET /Path/FileName HTTP/1.0 |
Accept: **表示接收任何类型的数据。User-Agent表示用户代理,这个字段可有可无,但强烈建议加上,因为它是服务器统计、追踪以及识别客户端的依据。Connection字段中的close表示使用非持久连接。
关于HTTP协议更多的细节可以参考RFC2616(HTTP 1.1)。因为我只是想通过HTTP协议实现文件下载,所以也只看了一部分,并没有看全。
如果服务器成功收到该请求,并且没有出现任何错误,则会返回类似下面的数据:
代码如下 | 复制代码 |
HTTP/1.0 200 OK Content-Length: 13057672 Content-Type: application/octet-stream Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT Accept-Ranges: bytes ETag: "2f38a6cac7cec51:160c" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Date: Wed, 16 Nov 2005 01:57:54 GMT Connection: close |
先定义一个函数 getRange() 这个函数用来处理 header中 Range 具体数据的处理
代码如下 | 复制代码 |
/** $file_size 文件大小 */ function getRange($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) $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; } |
假设文件的地址为 $file_path
代码如下 | 复制代码 |
$speed = 512;//此参数为下载最大速度 |
基本如此 就可以解决一般性文件的断点续传或者下载