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中进行身份认证
Oct 09 PHP
set_include_path和get_include_path使用及注意事项
Feb 02 PHP
php更新修改excel中的内容实例代码
Feb 26 PHP
php数组中包含中文的排序方法
Jun 03 PHP
thinkphp获取栏目和文章当前位置的方法
Oct 29 PHP
浅谈php提交form表单
Jul 01 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP构造二叉树算法示例
Jun 21 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
Jquery修改页面标题title其它JS失效的解决方法
2014/10/31 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
Vue中使用Sortable的示例代码
2018/04/07 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
HTML5 canvas基本绘图之图形变换
2016/06/27 HTML / CSS
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
豪华床上用品 :Jennifer Adams
2019/09/15 全球购物
一个C/C++编程面试题
2013/11/10 面试题
校园招聘策划书
2014/01/09 职场文书
幼儿园招生广告
2014/03/19 职场文书
yy司仪主持词
2014/03/22 职场文书
活动总结模板
2014/05/09 职场文书
弄虚作假心得体会
2014/09/10 职场文书
党员干部学习心得体会
2016/01/23 职场文书
matplotlib之pyplot模块实现添加子图subplot的使用
2021/04/25 Python