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文件
Jan 04 PHP
用Zend Encode编写开发PHP程序
Feb 21 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
CodeIgniter基本配置详细介绍
Nov 12 PHP
PHP实现自动对图片进行滚动显示的方法
Mar 12 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
php使用Jpgraph绘制柱形图的方法
Jun 10 PHP
php文件系统处理方法小结
May 23 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
浅谈php常用的7大框架的优缺点
Jul 20 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中读取和写入WORD文档的代码
2008/04/09 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
iOS+PHP注册登录系统 PHP部分(上)
2016/12/26 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
python中的for循环
2018/09/28 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
python中图像通道分离与合并实例
2020/01/17 Python
django从后台返回html代码的实例
2020/03/11 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
教研处工作方案
2014/05/26 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript