当前位置:首页 > PHP教程 > php上传下载 > 列表

PHP下载大文件失败并限制下载速度的实例代码

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-22 14:25:51 浏览: 评论:0 

这篇文章主要介绍了PHP下载大文件失败并限制下载速度的实例代码,需要的朋友可以参考下。

1.问题:

PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错;

2.原因:

这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出;

3.解决:分段下载,并限制下载速度;

  1. <?php 
  2. //设置文件最长执行时间 
  3. set_time_limit(0); 
  4.  
  5. if (isset($_GET['filename']) && !emptyempty($_GET['filename'])) { 
  6.   $file_name = $_GET['filename']; 
  7.   $file = __DIR__ . '/assets/' . $file_name; 
  8. } else { 
  9.   echo 'what are your searching for?'; 
  10.   exit(); 
  11. } 
  12.  
  13. if (file_exists($file) && is_file($file)) { 
  14.   $filesize = filesize($file); 
  15.   header('Content-Description: File Transfer'); 
  16.   header('Content-Type: application/octet-stream'); 
  17.   header('Content-Transfer-Encoding: binary'); 
  18.   header('Accept-Ranges: bytes'); 
  19.   header('Expires: 0'); 
  20.   header('Cache-Control: must-revalidate'); 
  21.   header('Pragma: public'); 
  22.   header('Content-Length: ' . $filesize); 
  23.   header('Content-Disposition: attachment; filename=' . $file_name); 
  24.  
  25.   // 打开文件 
  26.   $fp = fopen($file, 'rb'); 
  27.   // 设置指针位置 
  28.   fseek($fp, 0); 
  29.  
  30.   // 开启缓冲区 
  31.   ob_start(); 
  32.   // 分段读取文件 
  33.   while (!feof($fp)) { 
  34.     $chunk_size = 1024 * 1024 * 2; // 2MB 
  35.     echo fread($fp, $chunk_size); 
  36.     ob_flush(); // 刷新PHP缓冲区到Web服务器 
  37.     flush(); // 刷新Web服务器缓冲区到浏览器 
  38.     sleep(1); // 每1秒 下载 2 MB 
  39.   } 
  40.   // 关闭缓冲区 
  41.   ob_end_clean(); 
  42.   fclose($fp); 
  43. } else { 
  44.   echo 'file not exists or has been removed!'; 
  45. } 
  46. exit();

Tags: PHP下载大文件 PHP限制下载速度

分享到: