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下判断数组中是否存在相同的值array_unique
Mar 25 PHP
PHP教程 预定义变量
Oct 23 PHP
php自动加载的两种实现方法
Jun 21 PHP
zend api扩展的php对象的autoload工具
Apr 18 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
PHP实现简单汉字验证码
Jul 28 PHP
php自定义分页类完整实例
Dec 25 PHP
PHP实现简单实用的分页类代码
Apr 08 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 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
漂亮但不安全的CTB
2006/10/09 PHP
php 输出双引号&quot;与单引号'的方法
2010/05/09 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
2013/05/06 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
flexible.js实现移动端rem适配方案
2020/04/07 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
[05:24]TI9采访——教练
2019/08/24 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
Python对象体系深入分析
2014/10/28 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
python用match()函数爬数据方法详解
2019/07/23 Python
python函数的作用域及关键字详解
2019/08/20 Python
python同步windows和linux文件
2019/08/29 Python
如何运行带参数的python脚本
2019/11/15 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
python让函数不返回结果的方法
2020/06/22 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
房屋租赁协议书
2014/10/18 职场文书
2014年实验室工作总结
2014/12/03 职场文书
一个都不能少观后感
2015/06/04 职场文书
教师节联欢会主持词
2015/07/04 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python