【问题标题】:Limiting download speed in PHP web frameworks限制 PHP Web 框架中的下载速度
【发布时间】:2012-04-25 10:27:30
【问题描述】:

我将使用 Web 框架在 PHP 中实现一个网站。我从来没有用 PHP 实现过网站……我学习新语言没有问题。 问题是我想知道是否可以使用 Zend、CakePHP 等框架来创建一个页面,让您以给定的速率(例如 50 KB/s)下载文件? 谢谢。

【问题讨论】:

    标签: php cakephp zend-framework bandwidth-throttling


    【解决方案1】:

    您的服务器应该处理这个问题,而不是 PHP。

    如果您有 Apache,请参见此处:

    Lighttpd请看这里:

    【讨论】:

    • 如果您提供的文件需要检查用户是否具有某种用户级别或权限,并且您希望基于此更改限制,那么仅使用服务器端解决方案将如何工作?
    • 我的猜测:通过不同的位置提供服务:<Location /fastdownload><Location /veryslowfreedownload>
    • 是的,我认为作为标记,您可以在这条路线上处理您的权限。使用 Lighttpd 的 TrafficShaping 链接中的 Selective traffic shaping plugin,只需发送标头即可轻松得多。
    • 但公平地说,我知道大多数服务器仍然带有 Apache2.2 - mod_ratelimit 似乎是 2.3 及更高版本。
    【解决方案2】:

    据我所知,限制下载速度不是核心的一部分,但这很容易实现,只需扩展 MediaView 类并将 simple feature 添加到它。

    【讨论】:

    • 这看起来很有趣,但在我看来效率极低。
    • 为什么效率会低?
    • 因为这是一个应该由网络服务器处理的问题。当网络服务器(带有一些修改/插件)可以更高效地这样做时,为什么要使用 PHP 来伪造“速率限制”并消耗额外的资源?此外,如果询问者使用的是 Apache,那么会为每个 PHP 请求创建一个新线程。通过使用sleep() 人为地减慢脚本执行速度,线程占用的资源被有效锁定,我们可以服务的客户端总数将急剧减少。
    【解决方案3】:

    在这些框架中也可以使用 PHP 做的所有事情。诀窍是在不违反框架规则(例如 MVC 模式)的情况下做到这一点。

    在 CakePHP 中,绝对有可能创建一个控制器动作来输出一个包含所有需要的头文件的二进制文件。在您的控制器操作中,您可以比limit the download speed with standard php

    【讨论】:

      【解决方案4】:

      在我看来,PHP 不是限制下载的好语言。我从来没有这样做过,但我会这样做

      header('Content-type: image/jpeg');
      header('Content-Disposition: attachment; filename="image.jpg"');
      $f = file('may_image_or_file_to_download.jpg');
      
      foreach($f as $line){
        echo $line;
        flush();
        usleep(10000); //change sleep time to adjusting download speed
      }
      

      如果有可能,最好使用一些 Apache 模组

      对不起我的英语

      【讨论】:

        【解决方案5】:

        如果框架不提供该功能,请使用现有库,例如bandwidth-throttle/bandwidth-throttle

        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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 2016-02-03
          • 2013-03-30
          • 1970-01-01
          • 1970-01-01
          • 2018-04-25
          相关资源
          最近更新 更多