2010-09-25 88 views
3

任何人都可以給我一個快速入門如何使用內存資源?我知道我可以起來在php.ini以及代碼行,如PHP內存限制:PHP內存限制

ini_set("memory_limit","24M"); 

我有我寫的是正在使用一個很酷的PHP的圖片上傳腳本腳本叫simpleImage可以在這裏找到:http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php

我有一個基本的形式,接受JPG和PNGs。我已經將我的PHP內存限制設置爲24米,認爲這會足夠高,但是當我嘗試上傳3mb圖像時,我仍然收到美麗的內存分配耗盡錯誤。將價值提高到240M,腳本運行良好(本地)。

我的腳本做到這一點:
1)接受的TMP圖片被上傳
2)運行和getimagesize()在圖像上,以檢查它是否是一個有效的圖像。
3)將臨時圖像移動到最終的目標目錄。
4)使用簡單圖像加載圖像。
5)使用簡單圖像調整圖像大小。
6)使用簡單的圖像腳本保存調整大小的圖像。

所以我想所有的加載/檢查/調整大小需要比24M多一點。但我擔心可以接受的內存限制分配是多少。我希望用戶能夠舒適地上傳〜6MB圖像。這對您的普通專用服務器來說會非常緊張嗎?

這是我的腳本的主旨..我個人認爲它不是過度浪費資源?

if (!empty($_FILES)) { 
    // get image 
    ini_set("memory_limit","24M"); 
    require_once('simpleImage.php'); 
    require_once('db.php'); 
    $tempFile    =  $_FILES['file']['tmp_name']; 
    $originalFile  = $_FILES['file']['name']; 
    $extension    =  strtolower(end(explode(".", $originalFile))); 
    $targetFile   = "path/to/directory/"; 

    // validate image 
    $validExtensions = array('jpg', 'jpeg', 'png'); 
    if(in_array($extension, $validExtensions)) { 
     $validExtension  = true;  
    } else { 
     $validExtension  = false;  
    } 

    if(getimagesize($tempFile) == false) { 
     $validImage  = false;  
    } else { 
     $validImage  = true;  
    } 


    if($validExtension == true && $validImage == true) { 
     if(move_uploaded_file($tempFile,$targetFile)) { 

      $image = new SimpleImage(); 
      $image->load($targetFile); 
      $image->resizeToWidth(500); 
      $image->save($targetFile); 
     } 
    } 
} 

回答

3

格式諸如JPG和PNG是高度壓縮的,因此一個文件3MB是說6百萬像素可以很容易地擴展到24MB在存儲器中。添加輸出圖像和PHP自己的需求可以很容易地使內存使用跨越30MB。

實際的內存需求更多取決於圖片的尺寸而不是文件的大小。對於RGB圖像(JPEG和不透明PNG)或對於RGBA圖像(透明PNG)的megapixels * 4 MB,粗略估計將是megapixels * 3MB。不要忘了,GD庫本身可能會爲了各種目的而保留臨時內部緩衝區,所以這個估計值的兩倍應該是一個合理的內存使用限制。

2

機會是你的內存限制可能太低。

請記住,編輯圖像文件時,它們通常需要在內存中進行未壓縮存儲。因此,雖然3000x3000 jpeg可能輕鬆低於3MB,但未壓縮的尺寸將爲3000x3000x3(3代表RGB的每個字節爲1字節)或27MB,並且如果您有Alpha通道,則爲36MB。 另外,當完成一個圖像資源時,一定要銷燬它,以便釋放資源。

此外,如果您使用的是某種共享主機,則可能是ini_set功能已被禁用。如果可以的話,最好在php.ini中進行這樣的配置設置。我這樣說,所以你可以避免令人困惑的問題,爲什麼有ini_set("memory_limit","240M"),但仍然沒有足夠的內存可能發生。

2

你的平均服務器當然可以處理一些6meg文件的上傳。大多數用戶無疑將使用DSL或有線寬帶,這些寬帶的上傳帶寬相當低。 40-60kbyte /秒。大多數服務器至少有一個快速以太網鏈接(100mbit),理論上可以處理大約200個同時60k/s的上傳。

大負載將調整圖像大小,因爲在調整大小時需要將未壓縮的位圖保存在內存中。其他答案已經涵蓋了內存需求,但我想指出的是,使用PHP,內存限制必須足夠高以覆蓋上載文件的實際大小。

一個好的經驗法則是至少比您允許上傳的最大文件多1MB。除非你的代碼是臃腫的,否則它應該處理大多數你想用來做上傳處理的腳本,然後你可以提高限制來處理圖像大小調整的開銷。但是實際的上傳內存空間必須在服務器的配置(Apache的php_value指令)或PHP的php.ini文件中設置 - 在您的腳本執行完畢並執行ini_set('memory_limit', ...)時,上傳已完成(或由於內存不足)。

0

SimpleImage可能效率不高。程序內圖像處理的事實標準是ImageMagick。它用C編寫,非常高效。它也被廣泛使用和測試。請參閱php.net上的this page以獲取如何在PHP中安裝和使用它的說明。

+0

上面寫的simpleimage類使用GD,這是用php進行圖像處理的事實標準。 ImageMagick可能更高效,但它不包含在像GD這樣的php包中。 – 2011-04-22 18:37:22