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 08 PHP
PHP应用JSON技巧讲解
Feb 03 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
php清除和销毁session的方法分析
Mar 19 PHP
php错误日志简单配置方法
Jul 11 PHP
py文件转exe时包含paramiko模块出错解决方法
Aug 12 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 PHP
解决Laravel5.2 Auth认证退出失效的问题
Oct 14 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
提高PHP编程效率 引入缓存机制提升性能
2010/02/15 PHP
php邮件发送,php发送邮件的类
2011/03/24 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
jquery常用操作小结
2014/07/21 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
JS库之ParticlesJS使用简介
2017/09/12 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
vue实现简单学生信息管理
2020/05/30 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python底层封装实现方法详解
2020/01/22 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
安全生产承诺书
2014/03/26 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
小学教师年度个人总结
2015/02/05 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
python 网络编程要点总结
2021/06/18 Python
python 常用的异步框架汇总整理
2021/06/18 Python
Mysql 一主多从的部署
2022/05/20 MySQL