2010-12-06 99 views
3

我有一個PHP腳本,用於在用戶的FTP文件夾中調整圖像大小以便在其網站上使用。Image magick/PHP正在摔倒大圖像

雖然調整速度緩慢,但腳本已正確完成過去的所有圖像。然而,最近,用戶上傳了一張21萬像素JPEG圖像的相冊,並且我發現,該腳本無法轉換圖像,但沒有發出任何PHP錯誤。當我查閱各種日誌時,我發現多個Apache進程因內存不足錯誤而中斷。

PHP腳本的功能部分基本上是一個for循環,迭代通過我的盤上的圖像,並調用該檢查,如果縮略圖存在的方法,然後執行下列操作:

$image = new Imagick(); 
$image->readImage($target); 
$image->thumbnailImage(1000, 0); 
$image->writeImage(realpath($basedir)."/".rescale."/".$filename); 
$image->clear(); 
$image->destroy(); 

服務器具有512MB的RAM,通常至少360MB +免費。

PHP有它的內存限制,目前96MB設置,但我以前更高了設置沒有在這個問題上有任何影響。
據我估計,一個21萬像素的圖像在未壓縮時應該佔用80MB +的區域,所以我很困惑,爲什麼RAM消失得這麼快,除非Image Magick對象沒有從內存中移除。

有沒有什麼方法可以優化我的腳本,以便更有效地使用更少的內存或垃圾回收?
難道我只是沒有內存來應付這麼大的圖像嗎?

乾杯

+0

儘量只使用「轉換」命令行工具,它應該更快和韓元不計入PHP的內存限制。 – robbrit 2010-12-06 14:11:48

回答

2

呼叫$image->setSize()$image->readImage()之前有libjpeg的調整圖像大小,同時加載,以減少內存使用情況。

(編輯),示例用法:Efficient JPEG Image Resizing in PHP

+0

謝謝Steve-o,這證明可以大大幫助內存使用,並且我通過這樣做完成了整個方法。但應該注意的是,對於我試圖做的更大的桌面壁紙(1920x1200 +),它仍然在探測我。我想我必須對setSize()非常積極,讓我的用戶使用較小的圖像,或者完全使用另一種方法。感謝您的建議! – jmillar 2010-12-06 16:02:53

3

進行更詳細的說明,請參見this answer

imagick使用共享庫,它的內存使用情況是遙不可及的PHP的,所以調整PHP內存和垃圾收集也無濟於事。

嘗試創建new Imagick()對象在此之前加入:

// pixel cache max size 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 32); 
// maximum amount of memory map to allocate for the pixel cache 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 32); 

這將導致imagick交換到磁盤(默認爲/ TMP)時,它需要多於32 MB爲雜耍圖像。它會變慢,但不會耗盡內存(除非/ tmp在虛擬盤上,在這種情況下,您需要更改imagick寫入臨時文件的位置)。

+1

這是舊的,但這個評論是正確的,也是錯誤的。值在BYTES中,而不是MB。 `$ magick-> setResourceLimit(\ imagick :: RESOURCETYPE_MEMORY,67108864); $ magick-> setResourceLimit(\ imagick :: RESOURCETYPE_MAP,67108864);`對於64 MB的限制;不要在imagick的新版本上使用靜態調用 – Method 2016-03-31 22:49:03

2

MattBianco幾乎是正確的,唯一的變化就是內存限制是字節,因此將是33554432爲32MB:

// pixel cache max size 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MEMORY, 33554432); 
// maximum amount of memory map to allocate for the pixel cache 
IMagick::setResourceLimit(imagick::RESOURCETYPE_MAP, 33554432); 
+0

您應該在較新版本的imagick中使用該調用的非靜態變體; `$ img-> setResourceLimit(\ imagick :: RESOURCETYPE_MEMORY,33554432);` – Method 2016-03-31 22:52:46