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获取某个目录大小的代码
Sep 10 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
php中jpgraph类库的使用介绍
Aug 08 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
详解WordPress中添加和执行动作的函数使用方法
Dec 29 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
php和html的区别点详细总结
Sep 24 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
关于php开启错误提示的总结
2019/09/24 PHP
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
javascript弹性运动效果简单实现方法
2016/01/08 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
javascript中apply/call和bind的使用
2017/02/15 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
JavaScript遍历数组的三种方法map、forEach与filter实例详解
2019/02/27 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
2020/04/26 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
基于Linux系统中python matplotlib画图的中文显示问题的解决方法
2017/06/15 Python
详解python 注释、变量、类型
2018/08/10 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
如何基于python测量代码运行时间
2019/12/25 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
Python如何读写字节数据
2020/08/05 Python
Python类成员继承重写的实现
2020/09/16 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
Css3圆角边框制作代码
2015/11/18 HTML / CSS
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
英文简历自荐信范文
2013/12/11 职场文书
教师党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
深入理解python多线程编程
2021/04/18 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL