我编写了一个脚本,让您能够以我允许的最大文件速度下载文件,但是当我允许“无限制”速度(如10000kB / s)时,ftell工作很奇怪,它的行为类似于下载10000kBps速度,这是不正确的,我不能在数据库中进行计算,如剩余时间,当前下载速度等...
所以浏览器会在一段时间后下载文件,但是在数据库中它已经像'已下载',我怎么能进行一些精确计算,即使我设置了无限速度,这样用户就可以以网络和数据库的速度下载文件价值也是按他的网络速度计算的,不是ftell();
取决于$download_rate;
...?
提前致谢!
<?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);
}
?>
答案 0 :(得分:1)
限制下载速度取决于您的网络服务器。 PHP太高了。它对传出的数据一无所知。
测量也是如此:网络服务器会知道并可能以某种方式告诉你。日志,unix socket,事后,我不知道。这些链接会知道。
答案 1 :(得分:0)
如何(重新)将sleep(1);
内容添加到WHILE
循环中?从我可以看到的脚本几乎全部输出文件(尽可能快)并没有任何暂停它,所以它实际上限制下载速度。
这样你就知道你发送的每一秒只有64k字节(或其他什么),即使你不能确定用户实际上可以接收这么多数据/秒(哇,这么快!),它可能比你现在的那些更精确。
或者我错了吗?