zeus-server / bandwidth-throttler
此库可用于限制(节流)下载文件的传输速度。它通过设置一个缓冲处理程序来拦截PHP脚本输出,每次向浏览器提供一定字节数时都会调用该处理程序。库测量自上次PHP输出缓冲区刷新以来经过的时间,如果平均下载速度高于给定限制,则会在PHP上暂停一段时间。
Requires
- php: ^5.6
This package is auto-updated.
Last update: 2024-09-09 14:00:13 UTC
README
介绍
此库可用于限制(节流)下载文件的传输速度。
它通过设置一个缓冲处理程序来拦截PHP脚本输出,每次向浏览器提供一定字节数时都会调用该处理程序。
库测量自上次PHP输出缓冲区刷新以来经过的时间,如果平均下载速度高于给定限制,则会在PHP上暂停一段时间。
功能
有三个不同的带宽 shaping 机制来确保足够的服务质量
- 在向用户发送X字节后关闭突发传输速率(这可以帮助快速发送小图像,并限制大文件的下载速度)
- 在给定秒数的时期后关闭突发传输速率,然后将其恢复为标准节流速度
- 不激活突发传输速率,在整个下载过程中下载速度限制将保持恒定(在这种情况下 $config->burstLimit 必须等于 $config->rateLimit)
示例用法
示例 #1
按下载持续时间节流(在前30秒内以50.000字节/秒的速度发送文件,然后减速到15.000字节/秒)
<?php use Zeus\QoS\Throttle; use Zeus\QoS\ThrottleConfig; require("./throttler.php"); // create new config $config = new ThrottleConfig(); // enable burst rate for 30 seconds $config->burstTimeout = 30; // set burst transfer rate to 50000 bytes/second $config->burstLimit = 50000; // set standard transfer rate to 15.000 bytes/second (after initial 30 seconds of burst rate) $config->rateLimit = 15000; // enable module (this is a default value) $config->enabled = true; // start throttling $x = new Throttle($config); header("Content-type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.txt\""); header("Content-Length: 60000000"); // generate 60.000.000 bytes file. for($i = 0; $i < 60000000; $i++) { echo "A"; } ?>
示例 #2
按文件大小节流(以50.000字节/秒的速度发送小文件,以15.000字节/秒的速度发送大文件)
<?php use Zeus\QoS\Throttle; use Zeus\QoS\ThrottleConfigBySize; require("./throttler.php"); // create new config $config = new ThrottleConfigBySize(); // enable burst rate for first 500000 bytes, after that revert to the standard transfer rate $config->burstSize = 500000; // set burst transfer rate to 50000 bytes/second $config->burstLimit = 50000; // set standard transfer rate to 15.000 bytes/second (after initial 30 seconds of burst rate) $config->rateLimit = 15000; // enable module (this is a default value) $config->enabled = true; // start throttling $x = new Throttle($config); header("Content-type: application/force-download"); header("Content-Disposition: attachment; filename=\"test.txt\""); header("Content-Length: 60000000"); // generate 60.000.000 bytes file. for($i = 0; $i < 60000000; $i++) { echo "A"; } ?>
请参阅 example.php 和 example2.php 以获取工作实现示例。
详细信息
术语定义:节流过程,服务质量
节流过程(计算)
在软件中,节流过程,有时也称为节流控制器,是一个负责调节应用程序处理速率的过程,无论是静态的还是动态的。
例如,在高吞吐量处理场景中,这在在线事务处理(OLTP)架构中很常见,节流控制器可能嵌入在应用程序托管平台中,以平衡应用程序的输出发布速率与其输入消耗速率,优化可用于处理配置文件的系统资源,并防止最终不可持续的消耗。在,例如,企业应用程序集成(EAI)架构中,节流过程可能构建到应用程序逻辑中,以防止由于中间件层过度激进的发布而导致预期缓慢的最终系统过载。
服务质量
在计算机网络和其它分组交换电信网络领域,流量工程术语“服务质量”(QoS)指的是资源预留控制机制,而不是实际达到的服务质量。服务质量是指提供不同优先级给不同应用、用户或数据流,或者保证数据流达到一定性能的能力。例如,可以保证所需的比特率、延迟、抖动、数据包丢失概率和/或比特错误率等。当网络容量不足时,服务质量保证尤为重要,尤其是在对实时流媒体应用如VoIP、在线游戏和IP电视等,因为这些应用通常需要固定比特率并且对延迟敏感,在容量有限的网络中,例如在移动数据通信中。
使用PHP进行带宽限制的技术方面和注意事项
首先,PHP限制机制并不等同于低级系统流量整形。主要问题是PHP处理用户请求时比系统防火墙(标准PHP进程可能占用多达15-30MB的系统内存仅用于在网络中发送文件)消耗更多的系统资源。
另一个问题是,在共享主机上,PHP中对set_time_limit()函数的支持有限(由于安全模式或其他系统配置),因此当下载的文件太大时,必须将文件分成超过30秒(默认PHP时间限制,超过该时间请求将自动中止)的时间段发送给用户。在这种情况下,要发送更大的文件,您必须请求系统管理员将时间限制提高到30秒以上。
最后要记住的是,PHP可以在许多不同的操作系统和API上执行。例如,PHP可以安装为Apache模块(mod_php.so),或作为FastCGI模块(mod_fcgi + suexec)等。在任何这些情况下,都存在带宽限制可能因内部输出缓冲区(例如,参见httpd.conf中的Apache指令“SendBufferSize”或FastCGI输出缓冲区)而失败的风险,这些输出缓冲区有时在PHP中无法正确控制。在这种情况下,您必须请求系统管理员相应地修改配置文件(当然,这在共享主机上可能是个问题)。
该库的优缺点
PROS
- 小内存占用 - 输出是实时发送的,因此即使生成的12GB数据也可以使用大约8MB的RAM发送。
- 低CPU使用率 - 每个系统调用(如microtime())只针对发送的每个数据包执行一次,当需要时将数学计算结果缓存起来。
- 非侵入式限制 - 您只需在index.php或主文件中包含一次即可使用此类(通常不需要更改您的代码,如phpBB或Drupal)。
- 支持PHP 5.6+,作为Apache模块、FastCGI或CLI进程在所有已知操作系统上运行。
- 即插即用!
CONS
- 通常需要比php.ini文件中设置的默认30秒超时时间更长的时间(对于大文件或慢速传输)。
- 可能会因不寻常的系统配置而混乱(参见注意事项部分中的输出缓冲区)。
- 比防火墙等价物的内存占用更高。
- 当与多个下载器同时使用时,很容易耗尽FastCGI配置中设置的用户PHP进程限制(例如FCGI_MAX_CHILDREN)。