1

我已经编写了一个脚本,使您能够以我允许的最大文件速度下载文件,但是当我允许像 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);
    }
?>
4

2 回答 2

1

限制下载速度取决于您的网络服务器。PHP 太高级了。它对传出的数据一无所知。

测量也是如此:网络服务器会知道并且可能会以某种方式告诉您。日志,unix socket,事后,我不知道。这些链接会知道。

于 2013-08-31T17:12:16.157 回答
0

sleep(1);将那个东西(重新)添加到WHILE循环中怎么样?从我所看到的脚本几乎一次输出文件(尽可能快)并且没有任何暂停它,因此它实际上可以限制下载速度。

这样你就会知道你每秒只发送 64kbytes(或其他什么),即使你不能确定用户实际上每秒能收到这么多数据(哇,这么快!),它可能有点比你现在在那里的更精确。

还是我弄错了?

于 2013-08-31T08:53:24.433 回答