php限制文件下载速度的代码


Posted in PHP onOctober 20, 2015

有时候你会出于某种目的而要求把下载文件的速度放慢一些,例如你想实现文件下载进度条功能。限制下载速度最大的好处是节省带宽,避免瞬时流量过大而造成网络堵塞。本文将和你分享如何通过php代码来实现限制文件的下载速度。
首先来看看利用php限制文件下载速度的代码:

<?php 
// 将发送到客户端的本地文件 
$local_file='abc.zip'; 
// 文件名 
$download_file='your-download-name.zip'; 
// 设置下载速率(=> 31.2 kb/s) 
$download_rate=31.2; 
if(file_exists($local_file)&&is_file($local_file)){ 
 header('Cache-control: private');// 发送 headers 
 header('Content-Type: application/octet-stream'); 
 header('Content-Length: '.filesize($local_file)); 
 header('Content-Disposition: filename='.$download_file); 
 flush();// 刷新内容 
 $file=fopen($local_file,"r"); 
 while (!feof($file)){ 
  print fread($file,round($download_rate*1024));// 发送当前部分文件给浏览者 
  flush();// flush 内容输出到浏览器端 
  sleep(1);// 终端1秒后继续 
 } 
 fclose($file);// 关闭文件流 
}else{ 
 die('Error: 文件 '.$local_file.' 不存在!'); 
}

下面对以上代码做一些分析:
1、把文件下载速度限制为31.2kb/s,即每秒仅向客户端发送20.5kb的文件流,直到发送完整个文件为止。如果没有该限制,那么文件将以流的形式一起发送到客户端,有多少发送多少,这会出现什么情况?假如文件大小为2m,那么一下子把2m的数据流传送过去,这将可能导致网络堵塞而中断脚本的执行,这种下载方式是不能在实际应用中采用的。
2、技术方面,首先添加头文件,声明Content-Type为application/octet-stream,表示该请求将以流的方式发送,并且声明Content-Length,即声明了文件流的大小。在代码里使用了flush(),flush函数作用是刷新php程序的缓冲,实现print动态输出。

另外提醒一下的是:巧妙利用上述代码,还可以实现客户端显示文件下载进度条的功能,有兴趣的朋友可以试试,这里就不多写了。

以上就实现了php限制文件下载速度的功能,希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP新手上路(三)
Oct 09 PHP
PHP内核探索:变量概述
Jan 30 PHP
PHP jQuery表单,带验证具体实现方法
Feb 15 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
Nov 19 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
PHP 生成N个不重复的随机数
Jan 21 PHP
php获取网站百度快照日期的方法
Jul 29 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
PHP通过加锁实现并发情况下抢码功能
Aug 10 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
Aug 10 PHP
php使用yield对性能提升的测试实例分析
Sep 19 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
Mar 09 PHP
php获取远程文件大小
Oct 20 #PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 #PHP
php生成验证码函数
Oct 20 #PHP
php文件上传你必须知道的几点
Oct 20 #PHP
PHP判断上传文件类型的解决办法
Oct 20 #PHP
php上传大文件失败的原因及应对策略
Oct 20 #PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 #PHP
You might like
多文件上载系统完整版
2006/10/09 PHP
Dedecms常用函数解析
2008/02/01 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
PDO::quote讲解
2019/01/29 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
jquery text()要注意啦
2009/10/30 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
2017/09/18 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python合并多个装饰器小技巧
2015/04/28 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
python 调用Google翻译接口的方法
2020/12/09 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
Yves Rocher伊夫·黎雪美国官网:法国始创植物美肌1959
2019/01/09 全球购物
新电JAVA笔试题目
2014/08/31 面试题
2019年c语言经典面试题目
2016/08/17 面试题
店长岗位的工作内容
2013/11/12 职场文书
入党自我评价优缺点
2014/01/25 职场文书
绿色城市实施方案
2014/03/19 职场文书
欢迎新生标语
2014/10/06 职场文书
护理专业自荐信范文
2015/03/06 职场文书
毕业典礼致辞
2015/07/29 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis