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 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
php 无极分类(递归)实现代码
Jan 05 PHP
使用php计算排列组合的方法
Nov 13 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
Jun 29 PHP
PHP大批量插入数据库的3种方法和速度对比
Jul 08 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
Sep 26 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
Feb 21 PHP
基于PHP的登录和注册的功能的实现
Aug 06 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
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
js实现根据身份证号自动生成出生日期
2015/12/15 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
2018/03/15 Javascript
三种Webpack打包方式(小结)
2018/09/19 Javascript
原生JS实现的自动轮播图功能详解
2018/12/28 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
python一键升级所有pip package的方法
2017/01/16 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
Python读取stdin方法实例
2019/05/24 Python
我就是这样学习Python中的列表
2019/06/02 Python
Python正则表达式如何匹配中文
2020/05/27 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
新员工培训个人的自我评价
2013/10/09 职场文书
团员的自我评价
2013/12/01 职场文书
电钳专业个人求职信
2014/01/04 职场文书
三方合作协议书范本
2014/04/18 职场文书
小学德育工作经验交流材料
2014/05/22 职场文书
西柏坡导游词
2015/02/05 职场文书
六年级作文之关于梦
2019/10/22 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript