【问题标题】:PHP force download - files larger then 100MB will download only few bitesPHP 强制下载 - 大于 100MB 的文件只会下载几口
【发布时间】:2012-02-09 12:41:18
【问题描述】:

在我的托管服务提供商升级服务器 (Debian) 和 PHP(从 5.2.6 到 5.3.2)后,我的网站上的文件下载脚本出现问题。小于 100MB 的文件可以正常下载,但大于 100MB 的文件只能下载为 156 字节的文件……这是我的下载脚本:

class Download_Controller extends Website_Controller
{

    public function index()
    {
        if (isset($_GET['file'])) {
          $file     = $_GET['file'];
          $filORM   = ORM::factory('file')->where('filename', $file)->find();

          if ($filORM->loaded and $filORM->deleted=='N' and file_exists(APPPATH.'downloads/'.$file) ) {
            //we can serve file download
            $this->auto_render = false;

            $filORM->counter = $filORM->counter + 1;
            $filORM->save();

            $dl = ORM::factory('download');
            $dl->download_file_id = $filORM->id;
            $dl->created = time();
            $dl->country_id = $this->country->id;
            $dl->ip = $this->_getRealIpAddr();
            $dl->browser = Kohana::user_agent('browser');
            $dl->version = Kohana::user_agent('version');
            $dl->platform = Kohana::user_agent('platform');
            $dl->save();

            return download::force(APPPATH.'downloads/'.$file);
          }
          else {
            $this->download_error();
          }

        }
        else {
            //else here we load download center UI
            $this->section();
        }
    }   
}

我正在使用 Kohana PHP 框架。 2.3.x 版。

【问题讨论】:

标签: php apache kohana


【解决方案1】:

如果 Kohana 的 download::force() 的工作方式可能与在任何其他框架中的工作方式相同 - PHP 根本不能或不允许在内存中保存超过 100MB 的数据。

【讨论】:

  • 它在服务器升级之前完美运行...?有什么解决方法吗?
【解决方案2】:

我不知道download::force() 的代码是什么,但我认为它将整个文件加载到内存中并且PHP 停止执行并出现Allowed memory size is exhausted 之类的错误。您需要通过小块检查客户端是否中止连接来加载和输出文件。

更新

您的文件包含Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 141637633 bytes) in /home/www-data/system/helpers/download.php on line 93。所以,正如我所写,以小块的形式输出。

【讨论】:

    【解决方案3】:

    你可以尝试readfile(APPPATH.'downloads/'.$file),然后直接exit(),不用return,那么你就不会再被内存问题束缚了

    【讨论】:

      【解决方案4】:

      在 cmets 中,您给了我示例链接,我尝试了一个,我下载的 156 字节文件包含以下内容:

      致命错误:第 93 行 /home/www-data/system/helpers/download.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 141637633 字节)

      很清楚——PHP 内存不足。我想在升级时他们也改变了 php.ini 中的 memory_limit。短期解决方案是将其改回原来的(更高的)值。

      要下载大文件,您应该查看mod_xsendfile(也可用于 apache 以外的服务器),这涉及设置特殊的 http 标头,并将工作留给网络服务器而不是 php。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        相关资源
        最近更新 更多