PHP下载文件,限制最大速度并计算下载速度
我已经编写了一个脚本,让您能够以我允许的最大文件速度下载文件,但是当我允许“无限”速度(如10000kB/s)时,ftell工作异常,其行为就像以10000kBps速度下载文件,这是不正确的,我无法在数据库中计算剩余时间,当前下载速度等等 所以浏览器会在一段时间后下载文件,但在数据库中它已经像“已下载”一样,即使我设置了无限速度,用户也可以以网络速度下载文件,数据库值也会根据他的网络速度而不是PHP下载文件,限制最大速度并计算下载速度,php,Php,我已经编写了一个脚本,让您能够以我允许的最大文件速度下载文件,但是当我允许“无限”速度(如10000kB/s)时,ftell工作异常,其行为就像以10000kBps速度下载文件,这是不正确的,我无法在数据库中计算剩余时间,当前下载速度等等 所以浏览器会在一段时间后下载文件,但在数据库中它已经像“已下载”一样,即使我设置了无限速度,用户也可以以网络速度下载文件,数据库值也会根据他的网络速度而不是ftell()计算这取决于$下载率 提前谢谢 <?php while(!feof($fop
ftell()计算
这取决于$下载率代码>
提前谢谢
<?php
while(!feof($fopen)) {
//echo fread($fopen, 4096);
$this->get_allowed_speed_limit($download_rate);
//$download_rate = 350;
print fread($fopen, round($download_rate * 1024));
sleep(1); //needed for download speed limit
if(connection_status() != 0 || connection_aborted()) {
$bytes_transferred = ftell($fopen);
if($bytes_transferred < $bytes) {
//CANCELLED
$this->download_unsuccessfull($file_name);
} else {
//CANCELLED (but gets executed only on strange networks like eduroam in CZE)
$this->download_unsuccessfull($file_name);}
flush();
die;
} else {
$progress = ftell($fopen) / $bytes * 100;
if($progress >= 100) {
//DONE
$this->download_successfull($file_name);
flush();
} else {
//DOWNLOADING
if(ftell($fopen) != 0) {
$bytes_transferred = ftell($fopen);
$time_end = microtime(true);
$time = $time_end - $time_start;
$dl_speed = floor(($bytes_transferred / $time) / 1000);
///////HERE THE CALCULATIONS ARE TOTALLY WRONG, BECAUSE IT ALL DEPENDS ON THE INPUT OF $download_rate;
mysqli_query($con, "UPDATE `download_meter` SET `current_speed` = '".mysqli_real_escape_string($con, $bytes_transferred)."'");
$this->update_active_downloads($file_name, $bytes_transferred, $dl_speed);
}
flush();
}
}
//Activate this for delay download.
//flush();
//sleep(1);
}
?>
如何(重新)添加睡眠(1)代码>东西到循环时?从我所看到的,脚本几乎一次输出所有文件(尽可能快),并且没有任何东西会暂停它,因此它实际上可以限制下载速度
这样你就会知道,你每秒发送的数据只有64KB(或者其他什么),即使你不能确定用户每秒能接收到这么多数据(哇,太快了!),但它可能比你现在的数据更精确
还是我弄错了?再加上sleep(1)代码>东西到循环时?从我所看到的,脚本几乎一次输出所有文件(尽可能快),并且没有任何东西会暂停它,因此它实际上可以限制下载速度
这样你就会知道,你每秒发送的数据只有64KB(或者其他什么),即使你不能确定用户每秒能接收到这么多数据(哇,太快了!),但它可能比你现在的数据更精确
还是我弄错了?限制下载速度取决于您的Web服务器。PHP的级别太高。它对传出的数据一无所知
- 阿帕奇:
- Nginx:
测量也是如此:Web服务器会知道并且可能会以某种方式告诉您。日志,unix套接字,事实上,我不知道。这些链接将知道。限制下载速度取决于您的Web服务器。PHP的级别太高。它对传出的数据一无所知
- 阿帕奇:
- Nginx:
测量也是如此:Web服务器会知道并且可能会以某种方式告诉您。日志,unix套接字,事实上,我不知道。这些链接将知道。谢谢您的回复!它看起来不起作用,开始以1000kBps的速度下载很好,然后将速度改为10000kBps,显示文件下载了50%,而实际上下载了100个文件中的20MB,这说明我的计算对客户端浏览器的详细信息是错误的:/I试图将$download\u rate设置为10mbps左右,但用户的连接速度就像1mbps,所以我不想计算错误,我想重新计算客户端下载速度并为他设置限制,但我无法重新计算,因为这取决于我设置的$download\u速率,哼。。。Jo ty jsi taky cech^^^^你说,这主要是来自下载限制的另一端。嗯,这是一个艰难的决定。从用户的角度来看,我想不出任何方法来达到实际的下载速度,因为PHP就像。。服务器端。我一定会努力挖掘一些东西。谢谢你的回复!它看起来不起作用,开始以1000kBps的速度下载很好,然后将速度改为10000kBps,显示文件下载了50%,而实际上下载了100个文件中的20MB,这说明我的计算对客户端浏览器的详细信息是错误的:/I试图将$download\u rate设置为10mbps左右,但用户的连接速度就像1mbps,所以我不想计算错误,我想重新计算客户端下载速度并为他设置限制,但我无法重新计算,因为这取决于我设置的$download\u速率,哼。。。Jo ty jsi taky cech^^^^你说,这主要是来自下载限制的另一端。嗯,这是一个艰难的决定。从用户的角度来看,我想不出任何方法来达到实际的下载速度,因为PHP就像。。服务器端。我一定会努力挖掘一些东西。我不认为服务器可以知道客户端的下载速度。可能是在Web服务器中,但不是在PHP中。也许可以使用JS检查客户端?文件共享服务器如何在速度限制的情况下向客户端提供文件?您想限制下载速度吗?这应该不难。我以为你想测量一下。你真的在把你丰富的PHP技能与专业的文件共享服务器进行比较?是的,他们可以做到。我想限制和衡量速度,我的php技能没有那么差,但我在网上没有发现任何类似的东西。在debian wheezy下使用webserver nginx。我认为服务器无法知道客户端的下载速度。可能是在Web服务器中,但不是在PHP中。也许可以使用JS检查客户端?文件共享服务器如何在速度限制的情况下向客户端提供文件?您想限制下载速度吗?这应该不难。我以为你想测量一下。你真的在把你丰富的PHP技能与专业的文件共享服务器进行比较?是的,他们可以做到。我想限制和衡量速度,我的php技能没有那么差,但我在网上没有发现任何类似的东西。在debian wheezy下使用webserver nginx。nginx是我的选择,谢谢,但我如何限制移动速度?我想通过php实现这一点,因为我想编写一个机器人,在可能的情况下调整最大下载速度,并使用更多同步客户端对其进行优化。。?可能不是在下载过程中,但对于每个请求都不同。不管是什么解决方案,它都将是以Web服务器为中心的