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入门学习的几个不错的实例代码
Jul 13 PHP
PHP 写文本日志实现代码
May 18 PHP
用PHP即时捕捉PHP中的错误并发送email通知的实现代码
Jan 19 PHP
关于PHP语言构造器介绍
Jul 08 PHP
php查询whois信息的方法
Jun 08 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
Yii数据库缓存实例分析
Mar 29 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
Aug 29 PHP
实例讲解PHP页面静态化
Feb 05 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
PHP 开源框架22个简单简介
2009/08/24 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
php中mysql操作buffer用法详解
2015/03/19 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
php常用字符函数实例小结
2016/12/29 PHP
PHP Swoole异步Redis客户端实现方法示例
2019/10/24 PHP
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
纯js封装的ajax功能函数与用法示例
2018/05/14 Javascript
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
vue实现路由不变的情况下,刷新页面操作示例
2020/02/02 Javascript
nuxt.js添加环境变量,区分项目打包环境操作
2020/11/06 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python fabric实现远程操作和部署示例
2014/03/25 Python
Python中你应该知道的一些内置函数
2017/03/31 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
python设置值及NaN值处理方法
2018/07/03 Python
python重试装饰器的简单实现方法
2019/01/31 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
会议活动邀请函
2014/01/27 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
平安建设汇报材料
2014/12/29 职场文书
2015年人事科工作总结
2015/04/28 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技