2012-01-13 126 views
0

在我的託管服務提供商升級服務器(Debian)和PHP(從5.2.6到5.3.2)後,我在我們的網站上遇到了我的文件下載腳本問題。小則100MB的文件將下載好的,但較大的文件,然後將100MB的下載僅156個字節的文件......這是我的下載腳本:PHP強制下載 - 大於100MB的文件將只下載少量內容

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.

+0

你有訪問服務器嗎?或者它是一個託管服務器? – Stony 2012-01-13 09:39:44

+0

我有ssh訪問權限。 – 2012-01-13 09:40:56

+0

這些156字節文件的內容是什麼?有什麼特別的? – Maerlyn 2012-01-13 09:43:27

回答

2

在評論,你給我的示例鏈接,我試過一次,那156個字節的文件我下載的內容如下:

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

這很清楚 - PHP耗盡內存。我認爲在升級時他們也改變了php.ini中的memory_limit。短期解決方案是將其更改回原始(更高)值。

對於下載大文件,您應該查看mod_xsendfile(也可用於apache以外的服務器),包括設置一個特殊的http頭,並將工作留在web服務器而不是php。

0

如果Kohana的download::force()的工作方式與其他任何框架相同 - PHP無法或不允許在內存中保存超過100MB的數據。

+0

它在服務器升級之前完美地工作......?任何解決方法? – 2012-01-13 09:48:21

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。所以,就像我寫的那樣,以小塊輸出它。

0

你可以嘗試readfile(APPPATH.'downloads/'.$file)然後exit()的情況下直接return,那麼你將不會被綁定到內存問題了