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 相关文章推荐
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
Dec 24 PHP
php数组编码转换示例详解
Mar 11 PHP
PHP定时更新程序设计思路分享
Jun 10 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
Yii2 rbac权限控制之菜单menu实例教程
Apr 28 PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 PHP
PHP环形链表实现方法示例
Sep 15 PHP
php微信开发之谷歌测距
Jun 14 PHP
yii框架数据库关联查询操作示例
Oct 14 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 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写MySQL数据 实现代码
2009/06/15 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
JQuery 常用操作代码
2010/03/14 Javascript
jQuery示例收集
2010/11/05 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
python比较两个列表大小的方法
2015/07/11 Python
浅谈Python的异常处理
2016/06/19 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
Django网络框架之HelloDjango项目创建教程
2019/06/06 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
聊聊python中的异常嵌套
2020/09/01 Python
Python descriptor(描述符)的实现
2020/11/15 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
支票、地址标签、包装纸和慰问卡:Current Catalog
2018/01/30 全球购物
初中同学聚会感言
2014/02/11 职场文书
创意婚礼策划方案
2014/05/18 职场文书
爱国口号
2014/06/19 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
四风查摆剖析材料
2014/10/10 职场文书
合作协议书模板
2014/10/10 职场文书
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android