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将数据导入到Foxmail
Oct 09 PHP
用session做客户验证时的注意事项
Oct 09 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
PHP5中使用PDO连接数据库的方法
Aug 01 PHP
PHP的几个常用数字判断函数代码
Apr 24 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
php接口和抽象类使用示例详解
Mar 02 PHP
从刷票了解获得客户端IP的方法
Sep 21 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
Aug 07 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
Oct 11 PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 PHP
php优化查询foreach代码实例讲解
Mar 24 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
php下载远程文件类(支持断点续传)
2008/11/14 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
javascript回车完美实现tab切换功能
2014/03/13 Javascript
浅谈JavaScript Array对象
2014/12/29 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
jquery实现弹出层登录和全屏层注册特效
2015/08/28 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
详解js实时获取并显示当前时间的方法
2019/05/10 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
python executemany的使用及注意事项
2017/03/13 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
python 标准差计算的实现(std)
2019/07/29 Python
Python操作MongoDb数据库流程详解
2020/03/05 Python
Python eval函数原理及用法解析
2020/11/14 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
方正Java笔试题
2014/07/03 面试题
质量安全标语
2014/06/07 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
不同意离婚答辩状
2015/05/22 职场文书