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 12 PHP
在PHP中实现Javascript的escape()函数代码
Aug 08 PHP
解析yii数据库的增删查改
Jun 20 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
PHP系统命令函数使用分析
Jul 05 PHP
PHP生成随机数的方法实例分析
Jan 22 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 PHP
laravel 框架执行流程与原理简单分析
Feb 01 PHP
php多进程中的阻塞与非阻塞操作实例分析
Mar 04 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 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
如何把PHP转成EXE文件
2006/10/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
CI框架附属类用法分析
2018/12/26 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
js控制input输入字符解析
2013/12/27 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
JS实现的通用表单验证插件完整实例
2015/08/20 Javascript
javascript求日期差的方法
2016/03/02 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
JS判断form内所有表单是否为空的简单实例
2016/09/09 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
微信小程序 vidao实现视频播放和弹幕的功能
2016/11/02 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
elementUi vue el-radio 监听选中变化的实例代码
2019/06/28 Javascript
[01:08:29]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第一场 1月9日
2021/03/11 DOTA
python插入排序算法的实现代码
2013/11/21 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Python虚拟环境的创建和包下载过程分析
2020/06/19 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python 排序最长英文单词链(列表中前一个单词末字母是下一个单词的首字母)
2020/12/14 Python
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
酒店采购员岗位职责
2014/03/14 职场文书
会计学毕业生求职信
2014/06/25 职场文书
2016小学新学期寄语
2015/12/04 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers
python缺失值填充方法示例代码
2022/12/24 Python