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 上一篇,下一篇文章实现代码与原理说明
May 09 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
Jul 18 PHP
教你如何使用php session
Oct 28 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
全面了解PHP中的全局变量
Jun 17 PHP
php倒计时出现-0情况的解决方法
Jul 28 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 PHP
PHP笛卡尔积实现原理及代码实例
Dec 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
php Ubb代码编辑器函数代码
2012/07/05 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
图片自动更新(说明)
2006/10/02 Javascript
用js怎么把&amp;字符换成&quot;&amp;amp:&quot;
2006/10/19 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
从零学JSON之JSON数据结构
2014/05/19 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
JavaScript实现数字数组正序排列的方法
2015/04/06 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
讲解vue-router之什么是动态路由
2018/05/28 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
jquery实现的放大镜效果示例
2020/02/24 jQuery
原生javascript如何实现共享onload事件
2020/07/03 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
django迁移数据库错误问题解决
2019/07/29 Python
对tensorflow中tf.nn.conv1d和layers.conv1d的区别详解
2020/02/11 Python
jupyter notebook 多行输出实例
2020/04/09 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
客户接待方案
2014/02/26 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
学历公证委托书
2014/04/09 职场文书
先进典型事迹材料
2014/12/29 职场文书
团结友爱主题班会
2015/08/13 职场文书