PHP 断点续传实例详解


Posted in PHP onNovember 11, 2017

在做一个案例,要给客户端做断点续传的服务,

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

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

$file = $_GET['video'];
$size = filesize($file);
$size2 = $size-1;
$range = 0;
if(isset($_SERVER['HTTP_RANGE'])) { //http_range表示请求一个实体/文件的一个部分,用这个实现多线程下载和断点续传!
 header('HTTP /1.1 206 Partial Content');
 $range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
 $range = explode('-',$range);
 $range = trim($range[1]);
 header('Content-Length:'.$size);
 header('Content-Range: bytes '.$range.'-'.$size2.'/'.$size);
} else {
 header('Content-Length:'.$size);
 header('Content-Range: bytes 0-'.$size2.'/'.$size);
}
header("Content-type: video/mp4");
header('Accenpt-Ranges: bytes');
header('application/octet-stream');
header("Cache-control: public");
header("Pragma: public");
// 解决在IE中下载时中文乱码问题
$ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match('/MSIE/',$ua)) { //表示正在使用 Internet Explorer。
 $ie_filename = str_replace('+','%20',urlencode($file));
 header('Content-Dispositon:attachment; filename='.$ie_filename);
} else {
 header('Content-Dispositon:attachment; filename='.$file);
}
$fp = fopen($file,'rb+');
fseek($fp,$range);    //fseek:在打开的文件中定位,该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量。成功则返回 0;否则返回 -1。注意,移动到 EOF 之后的位置不会产生错误。
while(!feof($fp)) {    //feof:检测是否已到达文件末尾 (eof)
 set_time_limit(0);    //控制运行时间
 print(fread($fp,1024));   //读取文件(可安全用于二进制文件,第二个参数:规定要读取的最大字节数)
 ob_flush();      //刷新PHP自身的缓冲区
 flush();      //刷新缓冲区的内容(严格来讲, 这个只有在PHP做为apache的Module(handler或者filter)安装的时候, 才有实际作用. 它是刷新WebServer(可以认为特指apache)的缓冲区.)
}
fclose($fp);

php中set_time_limit()函数运用

当你的页面有大量数据时,建议使用set_time_limit()来控制运行时间,默认是30s,所以需要你将执行时间加长点。

如 set_time_limit(800) ,其中将秒数设为0 ,表示持续运行到程序结束。如果要停止运行只能重启php-fpm(文章后面附有重启命令)

如:set_time_limit(0)表示持续运行到程序结束,但这个函数有些在window环境下有些人设置不成功,Linux下也可能会出现问题的,做好在逻辑代码加上try catch避免异常。

注意:这个函数的运行需要你关闭安全模式,在php.ini中将safe_mode = Off 安全模式设置为Off,否则将会出现下面错误:
Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in

ps:在php.ini可以通过定义max_execution_time来设置PHP页面的最大执行时间。

在phpinfo()输出内容可以看到php相关配置。

Loaded Configuration File /etc/php.ini
set_time_limit(800);

这个函数指定了当前所在php脚本的最大执行时间为800秒,实际上

最大执行时间=php.ini里的max_execution_time数值 - 当前脚本已经执行的时间 + 设定值

假如php.ini里的max_execution_time=30,当前脚本已经执行5秒,则:

最大执行时间=30-5+800=825秒。

查看php运行目录命令:

which php
/usr/bin/php

查看php-fpm进程数:

ps aux | grep -c php-fpm

查看运行内存

/usr/bin/php -i|grep mem

重启php-fpm

/etc/init.d/php-fpm restart

总结

以上所述是小编给大家介绍的PHP 断点续传实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

PHP 相关文章推荐
上传多个文件的PHP脚本
Nov 26 PHP
php zend解密软件绿色版测试可用
Apr 14 PHP
PHP 危险函数全解析
Sep 09 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php数组去重实例及分析
Nov 26 PHP
PHP图片库imagemagick安装方法
Sep 23 PHP
PHP答题类应用接口实例
Feb 09 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
thinkPHP查询方式小结
Jan 09 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
PHP+AJAX 投票器功能
Nov 11 #PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 #PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 #PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 #PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 #PHP
PHP简单实现循环链表功能示例
Nov 10 #PHP
浅谈使用 Yii2 AssetBundle 中 $publishOptions 的正确姿势
Nov 08 #PHP
You might like
PHP删除数组中的特定元素的代码
2012/06/28 PHP
php 判断数组是几维数组
2013/03/20 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
php动态绑定变量的用法
2015/06/16 PHP
curl和libcurl的区别简介
2015/07/01 PHP
php实现图片上传、剪切功能
2016/05/07 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
2020/02/10 PHP
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
Zepto实现密码的隐藏/显示
2017/04/07 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
2017/07/24 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
python 实现二维列表转置
2019/12/02 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
python3处理word文档实例分析
2020/12/01 Python
努比亚手机官网:nubia
2016/10/06 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
内容编辑个人求职信
2013/12/10 职场文书
中英文自我评价语句
2013/12/20 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis