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 ADODB使用方法集锦
Mar 25 PHP
php目录管理函数小结
Sep 10 PHP
php教程 插件机制在PHP中实现方案
Nov 02 PHP
探讨PHP JSON中文乱码的解决方法详解
Jun 06 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
浅谈php冒泡排序
Dec 30 PHP
php通过strpos查找字符串出现位置的方法
Mar 17 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
Smarty变量用法详解
May 11 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
php实现断点续传大文件示例代码
Jun 19 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中OR与|| AND与&&的区别总结
2013/10/26 PHP
PHP实现更新中间关联表数据的两种方法
2014/09/01 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
2015/12/19 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
一个实用的php验证码类
2017/07/06 PHP
PHPExcel 修改已存在Excel的方法
2018/05/03 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
PHP7新特性
2021/03/09 PHP
发布一个基于javascript的动画类 Fx.js
2010/11/05 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
python 回调函数和回调方法的实现分析
2016/03/23 Python
Python实现简单登录验证
2016/04/13 Python
Python遍历numpy数组的实例
2018/04/04 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
2014年公务员工作总结
2014/11/18 职场文书
八年级语文教学反思
2016/03/03 职场文书
Python 的演示平台支持 WSGI 接口的应用
2022/04/20 Python
A22国内电台短波广播频率表
2022/05/10 无线电
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技