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 fsockopen写的HTTP下载的类
Feb 22 PHP
php自动跳转中英文页面
Jul 29 PHP
PHP 数组基础知识小结
Aug 20 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
jquery预加载图片的方法
2015/05/27 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
jQuery+pjax简单示例汇总
2017/04/21 jQuery
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
python检测服务器是否正常
2014/02/16 Python
Python实现的简单万年历例子分享
2014/04/25 Python
python简单实现基于SSL的IRC bot实例
2015/06/15 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python执行时间的计算方法小结
2017/03/17 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python中max函数用于二维列表的实例
2018/04/03 Python
python读取LMDB中图像的方法
2018/07/02 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
Otticanet英国:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/02/10 全球购物
乌克兰在线药房:Аптека24
2019/10/30 全球购物
简历中求职的个人自我评价
2013/12/03 职场文书
公司合并协议书范本
2014/09/30 职场文书
党员自我评价2015
2015/03/03 职场文书
老兵退伍感言
2015/08/03 职场文书