PHP下载文件,限制最大速度并计算下载速度

PHP下载文件,限制最大速度并计算下载速度,php,Php,我已经编写了一个脚本,让您能够以我允许的最大文件速度下载文件,但是当我允许“无限”速度(如10000kB/s)时,ftell工作异常,其行为就像以10000kBps速度下载文件,这是不正确的,我无法在数据库中计算剩余时间,当前下载速度等等 所以浏览器会在一段时间后下载文件,但在数据库中它已经像“已下载”一样,即使我设置了无限速度,用户也可以以网络速度下载文件,数据库值也会根据他的网络速度而不是ftell()计算这取决于$下载率 提前谢谢 <?php while(!feof($fop

我已经编写了一个脚本,让您能够以我允许的最大文件速度下载文件,但是当我允许“无限”速度(如10000kB/s)时,ftell工作异常,其行为就像以10000kBps速度下载文件,这是不正确的,我无法在数据库中计算剩余时间,当前下载速度等等

所以浏览器会在一段时间后下载文件,但在数据库中它已经像“已下载”一样,即使我设置了无限速度,用户也可以以网络速度下载文件,数据库值也会根据他的网络速度而不是
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服务器为中心的