2010-04-19 125 views
3

我創建縮略圖,通過大量的圖片循環,當我找到一個大的圖像,我得到:imagejpeg內存耗盡

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 13056 bytes) 

現在我已經知道如何與規避此:

ini_set('memory_limit', '-1'); 

我想知道的是爲什麼它耗盡了記憶!是否有一些調試工具能夠準確顯示內存何時耗盡?具體來說,這將顯示我是否有變數/數組正在殺死我的記憶?

或者,是否有更好的方式來調整其他圖像則:

$thumb=imagecreatetruecolor($newwidth,$newheight); 
$source=imagecreatefromjpeg($imgfile); 
imagecopyresampled($thumb,$source,0,0,0,0,$newwidth,$newheight,$width,$height); 
imagejpeg($thumb,$destinationfile,85); 

非常感謝!

+1

添加更多內存或處理較小的圖像。這是gdlib常見的問題,這就是爲什麼我更喜歡imagemagick。 – elias 2010-04-19 15:27:05

回答

1

有一些調試工具,將 告訴我什麼時候內存 耗盡?

您可以使用memory_get_usagememory_get_peak_usage

而具體,會告訴我,如果 存在變數/陣列被 殺死了我的記憶?

有時變量只是資源擁有者,實質上指向可能以其他語言創建的數據結構。 PHP無法衡量這些。只需在代碼中的可疑行後面使用內存使用函數來縮小罪魁禍首。

某些設置(如共享主機)限制了您修改內存要求的能力。這些限制可以在PHP,Web服務器和/或OS級別上實現。您需要通過調用phpinfo()來確保您的memory_limit請求成功。

3

一旦完成每個圖像(即$source$thumb),您可能需要致電imagedestroy(),尤其是在處理大量圖像時。 我不確定PHP的垃圾回收會清除GD圖像資源。

+0

我已經這樣做了,它看起來像在這條線上死去:$ source = imagecreatefromjpeg($ imgfile); – 0plus1 2010-04-19 15:18:41

+0

你在某處仍然有內存泄漏。確保你在源和目標GD資源上都做了一個'imagedestroy'。 – mattbasta 2010-04-19 17:20:27