在PHP中限制下载速度
我已经尝试过谷歌搜索中的一些基本功能,甚至我自己也尝试过写一个,但是我总是遇到问题。它似乎下载了内容服务器端或其他东西,然后将其推送到用户,用户已经下载了内容服务器端或其他东西。它将打开下载页面,大约需要10秒钟下载,然后将文件完整地提供给用户,这使得它看起来好像没有下载 我想知道是否有任何类被编写来限制下载速度,或者我如何解决这个问题 我现在有这个,在PHP中限制下载速度,php,download,bandwidth,Php,Download,Bandwidth,我已经尝试过谷歌搜索中的一些基本功能,甚至我自己也尝试过写一个,但是我总是遇到问题。它似乎下载了内容服务器端或其他东西,然后将其推送到用户,用户已经下载了内容服务器端或其他东西。它将打开下载页面,大约需要10秒钟下载,然后将文件完整地提供给用户,这使得它看起来好像没有下载 我想知道是否有任何类被编写来限制下载速度,或者我如何解决这个问题 我现在有这个, header("Content-type: application/force-download"); header("Content-
header("Content-type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize("uploads/$filename"));
header("Content-disposition: attachment; filename=\"$origname");
readfile("uploads/$filename");
谢谢
@set_time_limit(0); // don't abort if it takes to long
header("Content-type: application/force-download");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize("uploads/".$filename));
header('Content-disposition: attachment; filename="'.$origname.'"');
$perSecond = 5; // 5 bytes per second
$file = fopen("uploads/".$filename, 'r');
while(!feof($file)) {
echo fread($file, $perSecond);
flush();
sleep(1);
}
这将向用户发送一个下载速度受限的文件。它基本上是这样工作的:
- 打开一个文件
- 循环直到我们到达终点
- 回显X字节
- 将输出刷新到用户
- 睡一会儿
- 打开一个文件
- 循环直到我们到达终点
- 回显X字节
- 将输出刷新到用户
- 睡一会儿
重复。看看这个是的,但我有一个不同的问题,重复。检查这个是的,但我有一个不同的问题,我已经添加了它当前的样子,我将如何集成它?@HarryBeaant只需用我的代码片段替换readfile,用你的文件名(当然还有perSecond)替换我代码片段中的file.txt编辑:我刚刚更新了我的回答完成了,问题是它处理下载服务器端,然后将其推送到浏览器。所以你在下载时看不到它。@HarryBeaant我认为当你的文件无法在块中处理时,这是不可能的。你可以修改代码以支持Range:header,这样你就可以在文件下载时看到它的进度。我已经添加了它当前的样子,我将如何集成此功能?@HarryBeaant只需将readfile替换为我的代码段,并将代码段中的file.txt替换为您的文件名(当然还有perSecond)编辑:我刚刚更新了我的答案,问题是它处理下载服务器端,然后将其推送到浏览器。所以你在下载时看不到它。@HarryBeaant我认为当你的文件无法分块处理时,这是不可能的。你可以修改代码以支持Range:header,这样你就可以在文件下载时看到它的进度。
use bandwidthThrottle\BandwidthThrottle;
$in = fopen(__DIR__ . "/resources/video.mpg", "r");
$out = fopen("php://output", "w");
$throttle = new BandwidthThrottle();
$throttle->setRate(100, BandwidthThrottle::KIBIBYTES); // Set limit to 100KiB/s
$throttle->throttle($out);
stream_copy_to_stream($in, $out);