解决PHP超大文件下载,断点续传下载的方法详解


Posted in PHP onJune 06, 2013

最近导出的时候出现一个php内存溢出的问题,原因就是在于下载的时候读取生成的临时文件过大,PHP内存无法容纳,一开如是想到更改PHP内存限制,但是这个只是一个缓兵之计,于是想到了另外一个方法是把文件分次读取,并下载。
以下是源代码:

<?php 
$sourceFile = "1.tmp"; //要下载的临时文件名 
$outFile = "用户订单.xls"; //下载保存到客户端的文件名 
$file_extension = strtolower(substr(strrchr($sourceFile, "."), 1)); //获取文件扩展名 
//echo $sourceFile; 
if (!ereg("[tmp|txt|rar|pdf|doc]", $file_extension))exit ("非法资源下载"); 
//检测文件是否存在 
if (!is_file($sourceFile)) { 
die("<b>404 File not found!</b>"); 
} 
$len = filesize($sourceFile); //获取文件大小 
$filename = basename($sourceFile); //获取文件名字 
$outFile_extension = strtolower(substr(strrchr($outFile, "."), 1)); //获取文件扩展名 
//根据扩展名 指出输出浏览器格式 
switch ($outFile_extension) { 
case "exe" : 
$ctype = "application/octet-stream"; 
break; 
case "zip" : 
$ctype = "application/zip"; 
break; 
case "mp3" : 
$ctype = "audio/mpeg"; 
break; 
case "mpg" : 
$ctype = "video/mpeg"; 
break; 
case "avi" : 
$ctype = "video/x-msvideo"; 
break; 
default : 
$ctype = "application/force-download"; 
} 
//Begin writing headers 
header("Cache-Control:"); 
header("Cache-Control: public"); 
//设置输出浏览器格式 
header("Content-Type: $ctype"); 
header("Content-Disposition: attachment; filename=" . $outFile); 
header("Accept-Ranges: bytes"); 
$size = filesize($sourceFile); 
//如果有$_SERVER['HTTP_RANGE']参数 
if (isset ($_SERVER['HTTP_RANGE'])) { 
/*Range头域 Range头域可以请求实体的一个或者多个子范围。 
例如, 
表示头500个字节:bytes=0-499 
表示第二个500字节:bytes=500-999 
表示最后500个字节:bytes=-500 
表示500字节以后的范围:bytes=500- 
第一个和最后一个字节:bytes=0-0,-1 
同时指定几个范围:bytes=500-600,601-999 
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。 
*/ 
// 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- 
list ($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); 
//if yes, download missing part 
str_replace($range, "-", $range); //这句干什么的呢。。。。 
$size2 = $size -1; //文件总字节数 
$new_length = $size2 - $range; //获取下次下载的长度 
header("HTTP/1.1 206 Partial Content"); 
header("Content-Length: $new_length"); //输入总长 
header("Content-Range: bytes $range$size2/$size"); //Content-Range: bytes 4908618-4988927/4988928 95%的时候 
} else { 
//第一次连接 
$size2 = $size -1; 
header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928 
header("Content-Length: " . $size); //输出总长 
} 
//打开文件 
$fp = fopen("$sourceFile", "rb"); 
//设置指针位置 
fseek($fp, $range); 
//虚幻输出 
while (!feof($fp)) { 
//设置文件最长执行时间 
set_time_limit(0); 
print (fread($fp, 1024 * 8)); //输出文件 
flush(); //输出缓冲 
ob_flush(); 
} 
fclose($fp); 
exit ();

PHP 相关文章推荐
PHP中的正规表达式(一)
Oct 09 PHP
php学习 字符串课件
Jun 15 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
Apr 03 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
详解php魔术方法(Magic methods)的使用方法
Feb 14 PHP
Laravel与CI框架中截取字符串函数
May 08 PHP
PHP微信刮刮卡 附微信接口
Jul 22 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 #PHP
php IP转换整形(ip2long)的详解
Jun 06 #PHP
php全局变量和类配合使用深刻理解
Jun 05 #PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 #PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 #PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 #PHP
php将gd生成的图片缓存到memcache的小例子
Jun 05 #PHP
You might like
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
php生成随机数或者字符串的代码
2008/09/05 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
PHP7 弃用功能
2021/03/09 PHP
javascript一点特殊用法
2008/05/28 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
JS 实现可停顿的垂直滚动实例代码
2016/11/23 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
微信小程序使用navigateTo数据传递的实例
2017/09/26 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
使用python 打开文件并做匹配处理的实例
2019/01/02 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
python基于Selenium的web自动化框架
2019/07/14 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
2020/09/28 Python
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
运动会入场式解说词
2014/02/18 职场文书
小学语文课后反思精选
2014/04/25 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
python 实现体质指数BMI计算
2021/05/26 Python