2010-05-13 50 views
9

我想處理一個JPEG圖像(大約600+,範圍從50k到500k)的目錄使用PHP:GD來調整大小和保存圖像,但我已經打了一點點在整個過程中很早就陷入困境。在正確處理了3張圖像(30K,18K和231K)後,我得到一個允許的內存大小爲16777216字節耗盡 PHP致命錯誤。PHP GD允許的內存大小用盡

我騎自行車經過圖像並調用下面的代碼:

list($w, $h) = getimagesize($src); 

    if ($w > $it->width) { 
     $newwidth = $it->width; 
     $newheight = round(($newwidth * $h)/$w); 
    } elseif ($w > $it->height) { 
     $newheight = $it->height; 
     $newwidth = round(($newheight * $w)/$h); 
    } else { 
     $newwidth = $w; 
     $newheight = $h; 
    } 

    // create resize image 
    $img = imagecreatetruecolor($newwidth, $newheight); 
    $org = imagecreatefromjpeg($src); 

    // Resize 
    imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h); 
    imagedestroy($org); 

    imagejpeg($img, $dest); 

    // Free up memory 
    imagedestroy($img); 

我試圖釋放與imagedestroy功能的內存,但它似乎並沒有產生任何影響。該腳本只是在imagecreatefromjpeg代碼行處始終持續窒息。

我檢查了php.ini和memory_limit = 16M設置似乎它保持正確。但我無法弄清楚爲什麼記憶被填滿。它不應該將內存釋放回垃圾回收器嗎?我真的不想增加memory_limit設置。這似乎是一個糟糕的解決方法,可能會導致未來出現更多問題。

僅供參考:我從命令提示符運行我的腳本。它不應該影響功能,但可能會影響你的反應,所以我想我應該提到它。

任何人都可以看到,如果我只是缺少一些簡單的東西,或者如果這裏有設計缺陷?你會認爲這將是一個非常簡單的任務。這當然是可以的,對吧?

回答

15
ini_set('memory_limit', '64M'); 

問題解決

+0

我會試試這個。我的猜測是它會在這個過程的後期出錯。我希望我錯了。 – gurun8 2010-05-13 15:56:39

+0

我錯了。這工作。謝謝。 – gurun8 2010-05-13 16:06:35

+5

我想我應該剛發佈了什麼而不是爲什麼要做。 – JYelton 2010-05-13 16:07:59

12

有可能您的一個或多個圖像在原始內存中實際膨脹到16M。一種檢查方法是在Photoshop或Irfanview中打開它並檢查色彩空間和像素尺寸。例如,考慮一個「低」600萬像素的攝像頭,它並不需要太多的達到16M。它創建了2072像素的2048像素圖像。在每種顏色一個字節(RGB)的原始尺寸爲:

3072×2048×3 = 18874368

所以,你可能需要根據你的期望進程的最大圖像增加內存。但是你必須考慮他們的原始尺寸。

+0

我會檢查出來。謝謝。 – gurun8 2010-05-13 15:26:36

+3

而gd不僅存儲三個但每個像素四個字節〜25M – VolkerK 2010-05-13 15:28:07

+0

我認爲這是一個alpha通道?好點,VolkerK。 – JYelton 2010-05-13 15:43:26

0

只需使用ini_set();並設置memory_limit的任何你想要的大小。

1

在某些情況下,您根本無法預測將要處理的圖像所需的最高內存分配。爲了避免撞車,你可以包括之前和你的循環後,下面的命令:

register_shutdown_function ('my_function'); 
$mem_limit = ini_get ('memory_limit'); 
ini_set ('display_errors', false); 
ini_set ('memory_limit', '400M');   // some high value 

(...你...進程)

ini_set ('memory_limit',$mem_limit); 
函數內

和地點 「創建my_function()」將處理崩潰的代碼。

相關問題