2011-05-25 43 views
2

我已經做了一些搜索,我明白,它是不可能從耗盡的內存致命錯誤中恢復。我有一個運行imagecreatefromjpeg的腳本。我嘗試捕獲異常,我試着用@運行函數,然後檢查返回值爲null或false,我試着用'die()'來運行它。什麼都沒有所以我無法從中恢復。可能檢查imagecreatefromjpeg是否會在運行之前導致內存耗盡的致命錯誤?

那麼有可能在我接觸之前預測它嗎?是否有可能檢查一個JPEG的未壓縮的大小,然後優雅地死亡?我想按照「圖片$圖片太大而無法處理」的方式向我的用戶發送消息,您需要手動創建縮略圖。

我的共享主機不允許我將內存大小增加到64mb以上,所以這不是一個選項。我的代碼如下...

function createthumb($section,$filename,$constrain=100) 
{ 
    $dir = "$section/thumbs_$constrain"; 
    if(file_exists($workingdir."$section/thumbs_$constrain/$filename")) return 1; 
    if(!file_exists($dir)) mkdir($dir); 

    $src = imagecreatefromjpeg($workingdir."$section/$filename"); 
... 

回答

7

作爲一個經驗法則工作,你可以使用大小以像素爲單位由getimagesize()返回:

list ($width, $height) = getimagesize($file); 
$memory = $width * $height * 4; // 4 bytes per pixel 

如果這個數目大於一個預定義的極限時(以憑經驗確定,開始像32 * 1024 * 1024之類的東西),然後不要加載它imagecreatefromjpeg()

+1

謝謝。我現在就做這個。我會研究imagemagic的長期解決方案。 32 * 1024 * 1024的數字是否接近觸發內存超限64MB的限制? – MrVimes 2011-05-25 17:30:08

+0

我已經完成了一些測試,它似乎*使用的公式是這樣的:以ini_get('memory_limit')'*的值以字節爲單位*並乘以0.19。然後將其與上傳圖像中的像素總數(寬度x高度)進行比較。如果上傳的圖像中的像素總數大於第一個數字,則拒絕它。我已經在兩臺服務器上使用0.19和0.20作爲乘數並且0.19作用。 – Nick 2012-04-07 00:02:19

+0

是的,每個像素使用4個字節,0.20意味着GD的可用內存大約80%,這看起來很正常!儘管這不是一門精確的科學。 – Benjamin 2012-04-08 14:09:12

1

你有沒有想過使用ImageMagic而不是GD? ImageMagic能夠在加載過程中調整jpegs的大小,所以它不會消​​耗大量的PHP內存。詳情請參閱this StackOverflow answer

+0

我會研究imagemagic。謝謝。儘管如此,現在我正在使用Benjamin Morel提出的答案。 – MrVimes 2011-05-25 17:28:32

0

您可以在imagegreatefromjpeg之前驗證字符串源大小。

相關問題