PHP使用range协议实现输出文件断点续传代码实例


Posted in PHP onJuly 04, 2014

range协议用途:一般是用在断点续传的时候,但是实际的用户很大,例如你的web server需要输出一个大文件,那么用range可以分段输出,缓解压力。同时在提供音乐视频等服务时可以缓冲下载,如果用户中途关闭,可以节约网络带宽。

<?php

// 文件名
$filename = $_GET ['filename'];

// 文件路径
$location = 'media/' . $filename;

// 后缀
$extension = substr ( strrchr ( $filename, '.' ), 1 );

if ($extension == "mp3") {
	$mimeType = "audio/mpeg";
} else if ($extension == "ogg") {
	$mimeType = "audio/ogg";
}

if (! file_exists ( $location )) {
	header ( "HTTP/1.1 404 Not Found" );
	return;
}

$size = filesize ( $location );
$time = date ( 'r', filemtime ( $location ) );

$fm = @fopen ( $location, 'rb' );
if (! $fm) {
	header ( "HTTP/1.1 505 Internal server error" );
	return;
}

$begin = 0;
$end = $size - 1;

if (isset ( $_SERVER ['HTTP_RANGE'] )) {
	if (preg_match ( '/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER ['HTTP_RANGE'], $matches )) {
		// 读取文件,起始节点
		$begin = intval ( $matches [1] );

		// 读取文件,结束节点
		if (! empty ( $matches [2] )) {
			$end = intval ( $matches [2] );
		}
	}
}

if (isset ( $_SERVER ['HTTP_RANGE'] )) {
	header ( 'HTTP/1.1 206 Partial Content' );
} else {
	header ( 'HTTP/1.1 200 OK' );
}

header ( "Content-Type: $mimeType" );
header ( 'Cache-Control: public, must-revalidate, max-age=0' );
header ( 'Pragma: no-cache' );
header ( 'Accept-Ranges: bytes' );
header ( 'Content-Length:' . (($end - $begin) + 1) );

if (isset ( $_SERVER ['HTTP_RANGE'] )) {
	header ( "Content-Range: bytes $begin-$end/$size" );
}

header ( "Content-Disposition: inline; filename=$filename" );
header ( "Content-Transfer-Encoding: binary" );
header ( "Last-Modified: $time" );

$cur = $begin;

// 定位指针
fseek ( $fm, $begin, 0 );

while ( ! feof ( $fm ) && $cur <= $end && (connection_status () == 0) ) {
	print fread ( $fm, min ( 1024 * 16, ($end - $cur) + 1 ) );
	$cur += 1024 * 16;
}

range协议官方文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

PHP 相关文章推荐
PHP分页显示制作详细讲解
Oct 09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
Jun 08 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
PHP生成RSS文件类实例
Dec 05 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
laravel 时间格式转时间戳的例子
Oct 11 PHP
PHP实现简单用户登录界面
Oct 23 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 #PHP
成为好程序员必须避免的5个坏习惯
Jul 04 #PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 #PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 #PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 #PHP
php实现批量压缩图片文件大小的脚本
Jul 04 #PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 #PHP
You might like
php 获取可变函数参数的函数
2009/08/26 PHP
PHP 第一节 php简介
2012/04/28 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
JavaScript:Div层拖动效果实例代码
2013/08/06 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
js实现input框文字动态变换显示效果
2015/08/19 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
js操作cookie保存浏览记录的方法
2015/12/25 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python3中rank函数的用法
2019/11/27 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
Python基础教程(一)——Windows搭建开发Python开发环境
2020/07/20 Python
python selenium xpath定位操作
2020/09/01 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
财务部经理岗位职责
2014/02/03 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
志愿者个人总结
2015/03/03 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS