2015-07-02 36 views
0

我有以下代碼需要從HTML <form>$_POST ed圖像並上載它們。然後重新調整它們的大小(最多兩次)並將這些較小的圖像保存到同一目錄中。釋放內存在圖像調整大小腳本(GD)

但是,在處理較大的文件時,內存不足。

我的問題不是「如何防止X錯誤發生?」,而是「如何釋放此腳本正在使用的內存以便它可以繼續?」

<?php 
if (!isset($_POST['SiteID']) || !filter_var($_POST['SiteID'], FILTER_VALIDATE_INT)) { 
    header("Location: ./"); 
    exit(); 
} 
$SiteID = $_POST['SiteID']; 

if (!isset($_POST['GalleryID']) || !filter_var($_POST['GalleryID'], FILTER_VALIDATE_INT)) { 
    header("Location: ./?SiteID=" . $SiteID . "&error=upload"); 
    exit(); 
} 
$GalleryID = $_POST['GalleryID']; 

$ImageFile = $_FILES['ImageFile']; 

$Extensions = array("jpg", "jpeg"); 
$Timestamp = date("U"); 

require_once("db.php"); 

for ($X = 0; $X < count($_FILES['ImageFile']['name']); $X++) { 
    $Extension = strtolower(pathinfo($ImageFile['name'][$X], PATHINFO_EXTENSION)); 
    if (in_array($Extension, $Extensions)) { 
     if ($ImageFile['error'][$X] === UPLOAD_ERR_OK) { 
      if ($ImageFile['size'][$X] <= 5 * 1024 * 1024) { 
       $Filename = $GalleryID . "-" . $Timestamp . "-" . $X . "." . $Extension; 
       move_uploaded_file($ImageFile['tmp_name'][$X], "uploads/" . $Filename); 
       mysql_query("INSERT INTO NewGalleryImages SET GalleryID = $GalleryID, ImageFile = '$Filename', ImageCaption = ''"); 
       $Dimensions = getimagesize("uploads/" . $Filename); 
       $Width = ($Dimensions[0] > 768 ? 768 : $Dimensions[0]); 
       $Height = ($Dimensions[1]/$Dimensions[0]) * $Width; 
       $Expl = explode(".", $Filename); 
       $LargeFilename = $Expl[0] . "_gallery." . $Expl[1]; 
       $Source = "uploads/" . $Filename; 
       $Canvas = imagecreatetruecolor($Width, $Height); 
       $LargeImage = imagecreatefromjpeg($Source); 
       imagecopyresampled($Canvas, $LargeImage, 0, 0, 0, 0, $Width, $Height, $Dimensions[0], $Dimensions[1]); 
       imagejpeg($Canvas, "uploads/" . $LargeFilename, 100); 
       imagedestroy($Canvas); 
       $Width = 200; 
       $Height = ($Dimensions[1]/$Dimensions[0]) * $Width; 
       $Expl = explode(".", $Filename); 
       $ThumbFilename = $Expl[0] . "_thumb." . $Expl[1]; 
       $Source = "uploads/" . $Filename; 
       $Canvas = imagecreatetruecolor($Width, $Height); 
       $ThumbImage = imagecreatefromjpeg($Source); 
       imagecopyresampled($Canvas, $ThumbImage, 0, 0, 0, 0, $Width, $Height, $Dimensions[0], $Dimensions[1]); 
       imagejpeg($Canvas, "uploads/" . $ThumbFilename, 100); 
       imagedestroy($Canvas); 
      } else { 
       mysql_close(); 
       header("Location: ./?SiteID=" . $SiteID . "&error=size"); 
       exit(); 
      } 
     } else { 
      mysql_close(); 
      header("Location: ./?SiteID=" . $SiteID . "&error=unknown"); 
      exit(); 
     } 
    } else { 
     mysql_close(); 
     header("Location: ./?SiteID=" . $SiteID . "&error=type"); 
     exit(); 
    } 
} 

mysql_close(); 
header("Location: ./?SiteID=" . $SiteID . "&uploaded"); 
exit(); 

// var_dump($_POST); 
// var_dump($_FILES); 
// var_dump($ImageFile); 
?> 

我的PHP文件中讀到imagedestroy(),並試圖增加在給我在幾個地方的腳本,但1)我不知道,我破壞了正確的資源,和2 )我不確定它實際上是在清理內存。

我目前擁有的服務器上的以下設置:

post_max_size = 64M 
upload_max_filesize = 10M 
max_input_time = 60 
max_input_nesting_level = 64 
max_execution_time = 120 
memory_limit = 512M 
max_input_vars = 1000 

這是我收到錯誤消息:

Fatal error: Allowed memory size of 536870912 bytes exhausted 
(tried to allocate 29440 bytes) in 
/var/www/vhosts/example.com/httpsdocs/gallery-upload.php 
on line 36 

我發現了什麼奇怪的是,無論我有多increate memory_limit,它需要分配的「額外」總是相同的:29440 bytes

如果我單獨上傳圖像,腳本運行正常,但一次上傳超過兩個將引發錯誤。超過512MB的內存大小調整兩個圖像似乎過度,不是嗎?還是它還沒有足夠的記憶?我不確定這個服務器可以騰出多少...! 如何減少我的總內存使用量?

回答

1

在玩了一下之後,我設法讓我的腳本工作。我需要做的是使用兩個imagedestroy()的新形象,後每個原始圖像調整,即:

imagedestroy($LargeImage); 
imagedestroy($Canvas); 

我不知道這是否可以做,以釋放內存的一切,但它的工作(現在)。我相信有人會再次用更大的圖像文件測試我的內存限制...

+0

也'imagedestroy($ ThumbImage)' – Marek

+0

是的,我創建的每個圖像,謝謝。 – mpdc