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和ACCESS写聊天室(三)
Oct 09 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php 模拟POST|GET操作实现代码
Jul 20 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
PHP面向对象之旅:深入理解static变量与方法
Jan 06 PHP
php实现文件编码批量转换
Mar 10 PHP
PHP的几个常用加密函数
Feb 03 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
PHP写API输出的时用echo的原因详解
Apr 28 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
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php处理带有中文URL的方法
2016/07/11 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法
2017/12/24 jQuery
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
跟老齐学Python之dict()的操作方法
2014/09/24 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
2018/02/11 Python
python生成带有表格的图片实例
2019/02/03 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
写自荐信要注意什么
2013/12/26 职场文书
美德好少年主要事迹
2014/01/29 职场文书
文化产业实施方案
2014/06/07 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
青年文明号创建口号大全
2015/12/25 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书