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环境――Appserv
Dec 13 PHP
PHP函数utf8转gb2312编码
Dec 21 PHP
PHP 创建标签云函数代码
May 26 PHP
PHP5 的对象赋值机制介绍
Aug 02 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
win7安装php框架Yii的方法
Jan 25 PHP
PHP文件与目录操作示例
Dec 24 PHP
一个非常实用的php文件上传类
Jul 04 PHP
PHP addslashes()函数讲解
Feb 03 PHP
如何运行/调试你的PHP代码
Oct 23 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery实现友好的轮播图片特效
2015/01/12 Javascript
Perl Substr()函数及函数的应用
2015/12/16 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
js提交form表单,并传递参数的实现方法
2016/05/25 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
浅谈js函数三种定义方式 & 四种调用方式 & 调用顺序
2017/02/19 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python定时任务工具之APScheduler使用方式
2019/07/24 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
linux面试题参考答案(10)
2013/11/04 面试题
超市仓管员岗位职责
2014/04/07 职场文书
综治目标管理责任书
2015/05/11 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android