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写的serv-u的web申请账号的程序
Oct 09 PHP
PHP 和 MySQL 基础教程(三)
Oct 09 PHP
Cannot modify header information错误解决方法
Oct 08 PHP
MySQL的FIND_IN_SET函数使用方法分享
Mar 27 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
thinkphp中html:list标签传递多个参数实例
Oct 30 PHP
PHP计算加权平均数的方法
Jul 16 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
PHP在线调试执行的实现方法(附demo源码)
Apr 28 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
Laravel5.1 框架控制器基础用法实例分析
Jan 04 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 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
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
新浪SAE搭建PHP项目教程
2015/01/28 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
2015/12/17 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
bootstrap模态框消失问题的解决方法
2016/12/02 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
Js面试算法详解
2018/04/08 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
Angular6使用forRoot() 注册单一实例服务问题
2019/08/27 Javascript
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python3数字求和的实例
2019/02/19 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python3如何判断三角形的类型
2020/04/12 Python
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
附答案的Java面试题
2012/11/19 面试题
户外婚礼策划方案
2014/02/08 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
自荐信的格式
2014/03/10 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
新年联欢会主持词
2014/03/27 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
志愿者工作心得体会
2016/01/15 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL