php 断点续传 暂停,PHP 断点续传实例详解

在做一个案例,要给客户端做断点续传的服务,

断点续传主要是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 断点续传实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在php中插入数据并修改,php怎么同时向2张表里插入数据

情况是这个样子的:我要做一个发消息的表,因为接受人可能是多个,所以又给接收人一单独的表,(这种方案好还是全部都放到一张表里好点呢?)2张表的字段如下:message_id是第一张表的主键,如果收件人有…

java设计模式之道文字版,Java Web设计模式之道 PDF

资源名称:Java Web设计模式之道 PDF第一部分 仙人指路——设计模式简介第1章 设计模式概述1.1 设计模式是什么1.2 软件设计模式的发展历程1.3 作者阐述软件设计模式的主要方式第二部分 设计红宝书——设计模式原则详解第2章 设计原则之开闭原则2.1 何谓开闭原则2.2 …

java上传excel文件代码,求java把上传文件的excel表中数据存入数据库中.实现录入的代码?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼CREATE TABLE [dbo].[p_bom_user_info] ([ID] varchar(50) NULL ,[SESAID] varchar(200) NULL ,[StaffNo] varchar(200) NULL ,[NotesID] varchar(200) NULL ,[ACName] varchar(100) NULL ,[BusinessUnit] varchar(100) NULL ,[Com…

php开发视频播放顺序,请问关于php代码运行顺序问题

麻烦会的朋友帮忙回答下 以下的问题, 谢谢啦。在网上下载了套代码。 如下 admin.php 文件:对于以下这段代码, 究竟代码是怎么跑的呢?也就是比如说 以下的代码,什么时候 才会跑 if ($device ipad) 这句代码呢&#xff…

python文件操作模式是什么,python --文件操作模式详解

#f open(r"aaa/a.txt",modert) # f的值是一种变量,占用的是应用程序的内存空间,此时牵扯的是两个方面的资源#print(f)##2.操作文件:读/写文件,应用程序对文件的读写请求都是向操作系统调用,然后由操作系统控制把硬盘把输入读入内存…

php 中文转成url,php字符转URL地址的函数

php字符转URL地址的函数php提供了urlencode()、urldecode()、rawurlencode()、rawurldecode()函数了,利用它就可以直接转换URL地址。下面是小编为大家带来的.php字符转URL地址的函数,欢迎阅读。php字符转URL地址的函数代码如下function tourl($str) {$st…

php和ajax的同步和异步请求,ajax 同步请求和异步请求的差异分析_javascript技巧

ajax同步和异步的差异, 先看2段代码:代码一:Synchronize function(url,param) {function createXhrObject() {var http;var activeX [ "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];try …

matlab变量由非标量,matlab中的if语句

有条件性地执行语句语法if expressionstatementsend描述MATLAB计算表达式,如果产生一个逻辑真或者非零结果,然后就执行一条或者多条MATLAB命令语句。当有嵌套if时,每一个if必须和一个相应的end匹配。当你在if语句里面嵌套使用else if或者else…

如何用oracle查看内存使用情况,oracle运维08内存使用情况分析查看

1、SGA、PGA应用状况查问;select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctused from(select SGA name,(select sum(value/1024/1024) from v$sga) total,(select sum(bytes/1024/1024) from v$sgastat where …

rodbc 连接oracle,R語言 使用RODBC連接oracle數據庫

使用R語言有多種包可以連接oracle數據庫,我今天在這里講一下使用使用RODBC連接oracle數據庫。1. 如果你的本地是windows系統的話,你需要安裝oracle客戶端。2. 然后需要在ODBC管理者界面配置你要進行連接的數據庫數據及使用的驅動等信息。如下圖所示&…

oracle实验七 答案,Oracle表的常用查询实验(七)

Oracle表的常用查询实验(七)1.问题描述:有一个商品信息表,该表反应了各种商品的销售情况,一个产品是按照gid和gname两个字段来区分的,一个产品可能会有多个型号。create table T_Goods(Id int primary key,GId varchar2(10) not n…

调用oracle常用方法,区分Oracle和SQL Server常用函数调用方法

一、数学函数1.绝对值S:select abs(-1) valueO:select abs(-1) value from dual2.取整(大)S:select ceiling(-1.001) valueO:select ceil(-1.001) value from dual3.取整(小)S:select floor(-1.001) valueO:select floor(-1.001) value from dual4.取整(截取)S:select cast(-1.…

oracle函数大全指数运算,Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数),该如何解决...

当前位置:我的异常网 Oracle开发 Oracle 函数大全(字符串函数,数学函数,日期函数,Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数),该如何解决www.myexceptions.net 网…

oracle ogg00423,【案例】Oracle报错PLS-00378 PLS-00439产生原因和MOS官方解决办法

【案例】Oracle报错PLS-00378 PLS-00439产生原因和MOS官方解决办法时间:2016-11-12 21:31 来源:Oracle研究中心 作者:代某人 点击:次天萃荷净PLS-00378此版本的PL / SQL编译单元无效原因:编译单元是一个文件,其中包含的PL / SQL传递给编译器的源代…

oracle实验四运动会,实验四oracle的安全性和完整性控制

实验四 oracle的安全性和完整性控制实验目的:1.通过本实验能够熟练应用sql语言进行用户权限的授予和回收。2.熟练掌握实体完整性,参照完整性及用户定义的完整性的定义。3.并体会oracle数据库系统在安全性和完整性保护方面的特性。实验要求:1.…

pig连接oracle数据库,Pig安装讲解

Pig 简介:Pig 是 Apache 项目的一个子项目,Pig 提供了一个支持大规模数据分析的平台,Pig 突出的特点就是它的结构经得起大量并行任务的检验,使得它能够处理大规模数据集Pig 特点:Pig 可简化 MapReduce 任务的开发Pig …

linux系统如何备份系统软件,Linux折腾记(十三):我该如何备份系统

在前面的一些文章中,我反复提到经常会把系统搞崩溃,所以备份系统就是一件不容忽视的事情。由于Linux系统本身的优越性,系统的备份和还原还是比较容易的。主要表现在以下方面:1.Linux系统所有的数据都以文件的形式存在,…

linux kset subsystem 3.10内核,Kobject、Kset 和 Subsystem

2014年5月12日Kobject 、Kset 和 Subsy stem - 海王 - 博客园http://www.doczj.com/doc/93b5b6113b3567ec112d8a49.html/leav en/archiv e/2010/04/24/1719191.html 4/8件(2)4. Linux input 子系统 io 控制字段(2)5. linux 内核定时器 tim er_list 详解(2) (2)把kobject 的 kse…

linux基础命令下载,Linux基础命令教程豪华版

豪华版主张学到更多的Linux命令知识。从这里开始学习Linux命令,本课程让你更清楚地了解和掌握它,在Linux中命令是讲究大小写的,所以请管好你的CapsLock键。不用担心,Linux命令说到底是几个字母的东西,你能学好它的&…

linux中循环删除脚本,shell脚本:遍历删除

遍历删除文本内路径上文件windows上测试可以安装Git linux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张待删除图片a/b/c.jpgdeleteFile.sh脚本如下:#!/bin/bash#…