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 相关文章推荐
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
PHP中设置时区,记录日志文件的实现代码
Jan 07 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php二维数组排序详解
Nov 06 PHP
php导出excel格式数据问题
Mar 11 PHP
php读取flash文件高宽帧数背景颜色的方法
Jan 06 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
PHP 中常量的知识整理
Apr 14 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
php往mysql中批量插入数据实例教程
Dec 12 PHP
PHP strripos函数用法总结
Feb 11 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获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
2013/08/09 PHP
php网站地图生成类示例
2014/01/13 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
解决php-fpm.service not found问题的办法
2017/06/06 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
jquery处理json对象
2014/11/03 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
Python中的连接符(+、+=)示例详解
2017/01/13 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
为什么要有struct关键字
2012/05/08 面试题
怎么写好自荐信
2013/10/30 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
天网工程实施方案
2014/03/26 职场文书
承诺书格式
2014/06/03 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript
Python echarts实现数据可视化实例详解
2022/03/03 Python