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制作图型计数器的例子
Oct 09 PHP
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
Oct 13 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
Php-Redis安装测试笔记
Mar 05 PHP
PHP安装memcached扩展笔记
May 28 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
详谈PHP中的密码安全性Password Hashing
Feb 04 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 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用函数嵌入网站访问量计数器
Oct 27 #PHP
PHP实现网站访问量计数器
Oct 27 #PHP
You might like
Zend引擎的发展 [15]
2006/10/09 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
你必须知道的Javascript知识点之"深入理解作用域链"的介绍
2013/04/23 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
JavaScript数据存储 Cookie篇
2016/07/02 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
jQuery手风琴的简单制作
2017/05/12 jQuery
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
2020/07/22 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
python网络编程学习笔记(一)
2014/06/09 Python
python判断字符串是否纯数字的方法
2014/11/19 Python
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
pyhton列表转换为数组的实例
2018/04/04 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
keras 解决加载lstm+crf模型出错的问题
2020/06/10 Python
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
金融专业个人的自我评价
2013/10/18 职场文书
采购内勤岗位职责
2013/12/10 职场文书
个人简历自我评价范文
2014/02/04 职场文书
公司会计主管岗位责任制
2014/03/01 职场文书
坚定理想信念心得体会
2014/03/11 职场文书
软件项目开发计划书
2014/05/01 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
世界十大狙击步枪排行榜
2022/03/20 杂记