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获取表单textarea数据中的换行问题
Sep 10 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
探讨如何把session存入数据库
Jun 07 PHP
解析使用ThinkPHP应该掌握的调试手段
Jun 20 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
PHP连接access数据库
Mar 27 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 PHP
PHP安全之register_globals的on和off的区别
Jul 23 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
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
php调用新浪短链接API的方法
2014/11/08 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
js实现运行代码需要刷新的解决方法
2007/08/18 Javascript
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
Java 正则表达式学习总结和一些小例子
2012/09/13 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
python retrying模块的使用方法详解
2019/09/25 Python
如何基于Python创建目录文件夹
2019/12/31 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
护理专业应届毕业生推荐信
2013/11/15 职场文书
分层教学实施方案
2014/03/19 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
2014年实习生工作总结
2014/11/27 职场文书
考研英语辞职信
2015/05/13 职场文书
工作会议简报
2015/07/20 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP