当前位置:首页 > 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. if (file_exists($file) && is_file($file)) { 
  13.   $filesize = filesize($file); 
  14.   header('Content-Description: File Transfer'); 
  15.   header('Content-Type: application/octet-stream'); 
  16.   header('Content-Transfer-Encoding: binary'); 
  17.   header('Accept-Ranges: bytes'); 
  18.   header('Expires: 0'); 
  19.   header('Cache-Control: must-revalidate'); 
  20.   header('Pragma: public'); 
  21.   header('Content-Length: ' . $filesize); 
  22.   header('Content-Disposition: attachment; filename=' . $file_name); 
  23.  
  24.   // 打开文件 
  25.   $fp = fopen($file'rb'); 
  26.   // 设置指针位置 
  27.   fseek($fp, 0); 
  28.  
  29.   // 开启缓冲区 
  30.   ob_start(); 
  31.   // 分段读取文件 
  32.   while (!feof($fp)) { 
  33.     $chunk_size = 1024 * 1024 * 2; // 2MB 
  34.     echo fread($fp$chunk_size); 
  35.     ob_flush(); // 刷新PHP缓冲区到Web服务器 
  36.     flush(); // 刷新Web服务器缓冲区到浏览器 
  37.     sleep(1); // 每1秒 下载 2 MB 
  38.   } 
  39.   // 关闭缓冲区 
  40.   ob_end_clean(); 
  41.   fclose($fp); 
  42. else { 
  43.   echo 'file not exists or has been removed!'
  44. exit();

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

分享到: