PHP强制下载 - 大于100MB的文件只会下载很少的内容

时间:2012-01-13 09:34:00

标签: php apache kohana

我的托管服务提供商升级服务器(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。

4 个答案:

答案 0 :(得分:2)

在评论中,你给了我示例链接,我试了一个,我下载的那个156字节的文件包含了这个:

  

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

很明显 - PHP内存不足。我认为升级时他们也改变了php.ini中的memory_limit。短期解决方案是将其更改为原始(更高)值。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我不知道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 :(得分:0)

您可以在没有readfile(APPPATH.'downloads/'.$file)的情况下直接尝试exit()然后return,然后您将不再受内存问题的限制