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操作JSON格式数据的实现代码
Dec 24 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
php实现利用phpexcel导出数据
Aug 24 PHP
PHP基于数组实现的分页函数实例
Aug 20 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
php arsort 数组降序排序详细介绍
Nov 17 PHP
php格式化时间戳
Dec 17 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
php传值和传引用的区别点总结
Nov 19 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 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基于openssl的rsa加密解密示例
2016/07/11 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
Git命令之分支详解
2021/03/02 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
express + jwt + postMan验证实现持久化登录
2019/06/05 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Python实现微信机器人的方法
2019/09/06 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Python是怎样处理json模块的
2020/07/16 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
爱奇艺VIP会员:大剧抢先看
2018/07/11 全球购物
客户接待方案
2014/02/26 职场文书
药剂专业自荐书
2014/06/20 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
企业法人授权委托书
2014/09/25 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
专题民主生活会对照检查材料思想汇报
2014/09/29 职场文书
海贼王十大逆天果实 魂魂果实上榜,岩浆果实攻击力最强
2022/03/18 日漫
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技