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代码
Jul 14 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
Jan 07 PHP
php实现文件下载代码分享
Aug 19 PHP
php中curl使用指南
Feb 05 PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
PHP编写RESTful接口
Feb 23 PHP
Smarty分页实现方法完整实例
May 11 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP children()函数讲解
Feb 03 PHP
PHP设计模式之简单工厂和工厂模式实例分析
Mar 25 PHP
浅谈PHP中的那些魔术常量
Dec 02 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
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
2009/02/12 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
php中base64_decode与base64_encode加密解密函数实例
2014/11/24 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
python 查找字符串是否存在实例详解
2017/01/20 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
用python写测试数据文件过程解析
2019/09/25 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
python怎么提高计算速度
2020/06/11 Python
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
值传递还是引用传递
2015/02/08 面试题
2014年中秋节活动总结
2014/08/29 职场文书
机关党员公开承诺书
2014/08/30 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
2015年幼儿园新年寄语
2014/12/08 职场文书
公务员考察材料范文
2014/12/23 职场文书
看上去很美观后感
2015/06/10 职场文书
风之谷观后感
2015/06/11 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书