2009-07-13 28 views
5

有沒有辦法來防止PHP GD image library內存不足?如果上傳的圖片太大,GD往往會耗盡內存,終止腳本。我希望它能夠拋出一個可捕獲的異常或其他類似的東西,但事實並非如此。防止GD圖像庫耗盡內存的故障安全方式? (PHP)

現在我使用的是拼湊在一起的腳本,首先發出ini_set('memory_limit', '128M'),如果工作我通常都集。儘管這可能是不可能的,但根據服務器配置的不同,所以我又回到了一種試圖估算所需內存量(考慮分辨率,顏色深度,通道和模糊因素)的算法,然後將其與如果函數存在,則返回memory_get_usage(),否則進行粗略估計。

整個事情的工作,到目前爲止,但它優雅的遠,並會在一些邊緣的情況下失敗了,我敢肯定。有沒有更好的方法來做到這一點,即如果GD必須要優雅地失敗,而不是一切都停下來?

+1

大JPEG圖像(非PNG或其他類型的)可以調整負荷的同時,看到這個答案的詳細信息:http://stackoverflow.com/questions/12661/efficient-jpeg-image-resizing- in-php/4613341#4613341 – 2011-01-06 09:43:42

回答

3

購買更多記憶! :-P

雖然嚴重,就不可能處理被淘汰的內存,因爲你採取的任何行動都需要更多的內存。

最好的辦法是根據當前的內存設置限制正在上傳的圖像大小。

+2

大聲笑,給我買一個內存更多的主機。 ;-)那麼,我至少會喜歡GD來估計它自己的內存使用情況,而不是我不得不做錯誤傾向性的猜測,然後屏住呼吸。我不能僅以文件大小來限制圖像。具有高度壓縮的高分辨率JPG的小文件可能佔用比具有低分辨率PNG的大文件更多的內存。這就是爲什麼我必須回到我上面提到的計算。 – deceze 2009-07-13 03:08:41

0

最好的辦法就是停下來試圖弄清楚它需要多少內存,並且一開始就把它最大化 - 如果你有4GB的空間,告訴鏡像腳本使用2到4GB左右,當腳本結束時,讓它恢復正常,這將覆蓋所有潛在的致命情況。這是唯一的「萬無一失」的辦法,我能想到的反正...

+0

這就是我想要做的,但在共享主機上很少可能。對於這些情況,我正在進行最佳猜測計算,以防止掛斷。 – deceze 2009-07-13 07:31:26

+0

將PHP內存限制設置爲等於系統具有的RAM總量或遠程附近的任何位置,將允許用戶通過映像腳本對DOS進行DOS操作。確定事先需要多少內存是我能想到的唯一方法將阻止這種類型的DOS。 – 2017-08-13 19:23:43

1

還有另一種方式做到這一點,但它可以是費時,作爲圖像編輯過程中的某些部分會被重複許多時間,但可以將內存限制設置爲估計值,然後嘗試處理映像,如果失敗則捕獲異常,增加內存限制,然後再次處理映像 - 重複此操作直至您成功或達到某個內存限制 - 此時你會向用戶發出錯誤信息,說明他們的圖片太大而無法使用。

編輯:爲了趕上內存外的錯誤,你可以使用此解決方案:http://au2.php.net/set_error_handler#35622

+0

再次閱讀,AFAIK沒有任何可捕捉的東西被拋出。這是一次性的工作或它不運作。除非你能告訴我如何捕捉內存不足的錯誤,這正是我所要求的。 :) – deceze 2009-07-14 02:02:10

+2

有趕上這些錯誤的方式:http://au2.php.net/set_error_handler#35622 – jsnfwlr 2009-07-16 01:49:28

+0

我得看看這實際上幫助,由尼克指出,我不得不使用更多的內存在它發生之後處理錯誤。 – deceze 2009-07-26 05:38:05

3

創建圖像後。

imagepng($image); 
imagedestroy($image); 

將刪除存儲問題

0

做一些測試,以檢查多少內存每個gd功能需要。

  • imagecreatetruecolor似乎需要width*height*5 bytes

  • imagepng似乎需要width*height*4 bytes