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

 更新时间:2019年05月10日 10:34:21   作者:洪志  
这篇文章主要介绍了PHP下载大文件失败并限制下载速度的实例代码,需要的朋友可以参考下

1.问题:

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

2.原因:

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

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

<?php
//设置文件最长执行时间
set_time_limit(0);

if (isset($_GET['filename']) && !empty($_GET['filename'])) {
  $file_name = $_GET['filename'];
  $file = __DIR__ . '/assets/' . $file_name;
} else {
  echo 'what are your searching for?';
  exit();
}

if (file_exists($file) && is_file($file)) {
  $filesize = filesize($file);
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Transfer-Encoding: binary');
  header('Accept-Ranges: bytes');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . $filesize);
  header('Content-Disposition: attachment; filename=' . $file_name);

  // 打开文件
  $fp = fopen($file, 'rb');
  // 设置指针位置
  fseek($fp, 0);

  // 开启缓冲区
  ob_start();
  // 分段读取文件
  while (!feof($fp)) {
    $chunk_size = 1024 * 1024 * 2; // 2MB
    echo fread($fp, $chunk_size);
    ob_flush(); // 刷新PHP缓冲区到Web服务器
    flush(); // 刷新Web服务器缓冲区到浏览器
    sleep(1); // 每1秒 下载 2 MB
  }
  // 关闭缓冲区
  ob_end_clean();
  fclose($fp);
} else {
  echo 'file not exists or has been removed!';
}
exit();

总结

以上所述是小编给大家介绍的PHP下载大文件失败并限制下载速度的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • PHP模拟post提交数据方法汇总

    PHP模拟post提交数据方法汇总

    使用php模拟post传值虽然在日常生活中用到的不是很多,但是在某些场合还是经常用到的。下面脚本之家小编给大家整理了三种php模拟post传值的方法,file_get_contents、curl和socket,需要的朋友参考下
    2016-02-02
  • PHP获取真实IP及IP模拟方法解析

    PHP获取真实IP及IP模拟方法解析

    这篇文章主要介绍了PHP获取真实IP及IP模拟方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • PHP中使用smarty生成静态文件的例子

    PHP中使用smarty生成静态文件的例子

    这篇文章主要介绍了PHP中使用smarty生成静态文件的例子,需要的朋友可以参考下
    2014-04-04
  • 搭建PhpStorm+PhpStudy开发环境的超详细教程

    搭建PhpStorm+PhpStudy开发环境的超详细教程

    这篇文章主要介绍了搭建PhpStorm+PhpStudy开发环境的超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • php中的双引号与单引号的基本使用及区别

    php中的双引号与单引号的基本使用及区别

    字符串是一个非常要的知识,在开发中,有的使用单引号,有的使用双引号,这个是有区别的,这篇文章主要介绍了php中的双引号与单引号的基本使用,需要的朋友可以参考下
    2023-06-06
  • ThinkPHP之import方法实例详解

    ThinkPHP之import方法实例详解

    import方法是ThinkPHP框架用于类库导入的封装实现,这篇文章主要介绍了ThinkPHP的import方法,需要的朋友可以参考下
    2014-06-06
  • Laravel框架Eloquent ORM修改数据操作示例

    Laravel框架Eloquent ORM修改数据操作示例

    这篇文章主要介绍了Laravel框架Eloquent ORM修改数据操作,结合实例形式详细分析了laravel框架更新数据的两种常见操作技巧,需要的朋友可以参考下
    2019-12-12
  • PHP实现文件上传与下载

    PHP实现文件上传与下载

    这篇文章主要为大家详细介绍了PHP实现文件上传与下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • Symfony2创建页面实例详解

    Symfony2创建页面实例详解

    这篇文章主要介绍了Symfony2创建页面的方法,结合实例形式分析了Symfony页面创建的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-03-03
  • php 的反射详解及示例代码

    php 的反射详解及示例代码

    本文主要介绍PHP的反射内容的知识,这里提供相关的资料讲解,及简单示例代码供大家参考,有兴趣的小伙伴可以参考下
    2016-08-08

最新评论