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中uploaded_files函数使用方法详解
Mar 09 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
php数组编码转换示例详解
Mar 11 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 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实现Socket服务器的代码
2008/04/03 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
js 上传图片预览问题
2010/12/06 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jQuery实现仿百度帖吧头部固定导航效果
2015/08/07 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
详解Angular开发中的登陆与身份验证
2016/07/27 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
浅谈js中的this问题
2017/08/31 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
使用Python生成url短链接的方法
2015/05/04 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Flask和pyecharts实现动态数据可视化
2020/02/26 Python
Python中实现输入一个整数的案例
2020/05/03 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
大型公益活动策划方案
2014/08/20 职场文书
公司承诺函范文
2015/01/21 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
JavaScript offset实现鼠标坐标获取和窗口内模块拖动
2021/05/30 Javascript