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中常用数组处理方法实例分析
Aug 30 PHP
PHP include_path设置技巧分享
Jul 03 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
PHP 如何获取二维数组中某个key的集合
Jun 03 PHP
php实现过滤UBB代码的类
Mar 12 PHP
PHP查找与搜索数组元素方法总结
Jun 12 PHP
ThinkPHP路由机制简介
Mar 23 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
Oct 25 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php面向对象程序设计入门教程
Jun 22 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制作静态网站的模板框架(三)
2006/10/09 PHP
PHP技术开发技巧分享
2010/03/23 PHP
PHP 截取字符串专题集合
2010/08/19 PHP
php写的简易聊天室代码
2011/06/04 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
js中class的点击事件没有效果的解决方法
2016/10/13 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
vue-drawer-layout实现手势滑出菜单栏
2020/11/19 Vue.js
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
python 异常处理总结
2016/10/18 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
python+opencv识别图片中的圆形
2020/03/25 Python
pyhton列表转换为数组的实例
2018/04/04 Python
Django中的ajax请求
2018/10/19 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
毕业生的自我评价范文
2013/12/31 职场文书
庆元旦活动总结
2014/07/09 职场文书
银行开户授权委托书格式
2014/10/10 职场文书