2012-08-06 76 views
0

我使用2個PHP庫服務文件 - unzip,並dUnzip2是ini_set(「memory_limit」,「512M」);太多了?

拉鍊zip.lib
http://www.zend.com/codex.php?id=470&single=1

它們工作得很好的下10MB的文件,但有超過10MB的文件,我必須設置mem限制爲256.對於超過25MB的文件,我將它設置爲512.它看起來很高......是嗎?

我在一個專用的服務器上--4個CPU和16GB RAM - 但我們也有很多的流量和下載,所以我有點想知道這裏。

+0

那你究竟需要做什麼才能上傳一個'11MB'文件? – Jon 2012-08-06 03:39:19

+0

沒有上傳,下載,我們提供1K以上的文件,範圍從1MB到30MB – Benn 2012-08-06 03:40:15

+2

設置上限並不意味着php每次都會佔用那麼多的內存,這只是意味着它不會超過這個限制,如果它開始使用額外的內存。 – 2012-08-06 03:47:42

回答

1

也許你正在使用PHP將全部文件加載到內存中,然後再將它們提供給用戶?我使用了http://www.php.net/manual/en/function.readfile.php(註釋部分)中的一個函數,該函數在部分文件中提供文件,使內存保持較低。從那篇文章複製(因爲我的版本發生了變化):

<?php 
    function readfile_chunked ($filename,$type='array') { 
     $chunk_array=array(); 
     $chunksize = 1*(1024*1024); // how many bytes per chunk 
     $buffer = ''; 
     $handle = fopen($filename, 'rb'); 
     if ($handle === false) { 
     return false; 
     } 
     while (!feof($handle)) { 
      switch($type) 
      { 
       case'array': 
       // Returns Lines Array like file() 
       $lines[] = fgets($handle, $chunksize); 
       break; 
       case'string': 
       // Returns Lines String like file_get_contents() 
       $lines = fread($handle, $chunksize); 
       break; 
      } 
     } 
     fclose($handle); 
     return $lines; 
    } 
?> 
+0

偉大的解決方案! – Benn 2012-08-06 17:10:17

0

什麼我的劇本確實是用戶下載

之前授權文件一般應避免任何web腳本消耗那麼多的內存或CPU時間。理想情況下,您可以通過分離的流程將任務轉換爲運行。設置一個高限本身並不壞,但它使得難以發現寫得不好的腳本,並且更容易滿足複雜頁面的高要求,甚至在簡單頁面上也會損害性能。

例如,通過gearman,您可以輕鬆設置一些CLI上運行的許可證工作者腳本,並通過gearman API與他們進行通信。

通過這種方式,您的Web服務器可以保持自由執行低CPU和內存任務,並且您可以輕鬆保證您一次不會運行超過X個授權任務(其中X基於您允許的工作人員腳本數量跑)。

您的前端腳本可能只是一個輪詢服務器的AJAX小部件,檢查是否已完成任務。

+0

無法在我的服務器上運行PECL :( – Benn 2012-08-06 03:56:55

+0

@Benn,這只是我熟悉的一個建議,您可以通過數據庫中的隊列表輕鬆完成,而且這些都不是說設置高限制是不好的(特別是如果你只是爲那個頁面而做),但是我個人更喜歡在這種情況下使用更強大的解決方案。 – Matthew 2012-08-06 03:59:18

+0

好吧,我來說,一旦用戶點擊下載按鈕,它只會增加(需要文件)但是我不得不把它設置的很高我們在過去的4年沒有問題但是準備好了新的網站版本並且想要清理代碼 – Benn 2012-08-06 04:01:02