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 常用函数库和一些实用小技巧
Jan 01 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
Apr 12 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
php join函数应用
May 04 PHP
PHP static局部静态变量和全局静态变量总结
Mar 02 PHP
PHP实现微信公众平台音乐点播
Mar 20 PHP
php 类自动载入的方法
Jun 03 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
php微信开发之谷歌测距
Jun 14 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
Mar 30 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
javascript 异步页面查询实现代码(asp.net)
2010/05/26 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
Javascript点击按钮随机改变数字与其颜色
2016/09/01 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
原生js封装运动框架的示例讲解
2017/10/01 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
分享vue里swiper的一些坑
2018/08/30 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
python实现下载pop3邮件保存到本地
2018/06/19 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
python实现简单文件读写函数
2021/02/25 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
劳资员岗位职责
2013/11/11 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
中学生期末评语
2014/02/03 职场文书
安全协议书范本
2014/04/21 职场文书
意外死亡赔偿协议书
2014/10/14 职场文书
开幕式邀请函
2015/01/31 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电