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 相关文章推荐
ThinkPHP 连接Oracle数据库的详细教程[全]
Jul 16 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
修改WordPress中文章编辑器的样式的方法详解
Dec 15 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
php页面缓存方法小结
2015/01/10 PHP
jquery操作select大全
2014/04/25 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
Angularjs中三种数据的绑定策略(“@”,“=”,“&amp;”)
2016/12/23 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python微元法计算函数曲线长度的方法
2018/11/08 Python
Python闭包思想与用法浅析
2018/12/27 Python
python读csv文件时指定行为表头或无表头的方法
2019/06/26 Python
python命令行工具Click快速掌握
2019/07/04 Python
如何在python中写hive脚本
2019/11/08 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
django框架两个使用模板实例
2019/12/11 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
css3 border-image使用说明
2010/06/23 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
社区安全检查制度
2014/02/03 职场文书
爱情寄语大全
2014/04/09 职场文书
社区综治工作汇报
2014/10/27 职场文书
2016年小学教师师德承诺书
2016/03/25 职场文书
如何书写授权委托书?
2019/06/25 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python