2017-02-01 11 views
0

Ich benutze eine PHP-Datei, um Bilder von meiner Webanwendung auf meinen Server hochzuladen und habe kürzlich einige Probleme mit der Speicherbegrenzung behoben, von denen ich hoffte, dass jemand mit mehr Erfahrung als ich helfen könnte. Die meisten der hochgeladenen Bilder stammen von Handys, so dass die Dateigröße sehr überschaubar ist. In letzter Zeit gab es jedoch einige Uploads von einer Spiegelreflexkamera, die die Probleme verursacht haben. Diese Bilder sind ungefähr 7-8MB groß und ich hatte angenommen, dass unser PHP-Speicherlimit von 64MB dies handhaben würde. Bei der Überprüfung fand ich die Funktion imagecreatefromjpeg() in unserer Crop-Funktion als Täter, obwohl ich annahm, dass der Speicher davor gefüllt wurde, obwohl imagedestroy() verwendet wurde, um zuvor erstellte Bilder zu löschen. Bei Verwendung von ini_set ('memory_limit'), um das Limit auf einen viel höheren Wert zu erhöhen, fand ich das Skript wie erwartet funktioniert, aber ich würde eine sauberere Lösung bevorzugen. Ich habe den Code unten beigefügt und jede Hilfe würde sehr geschätzt werden. PHP Image Upload Speicherbegrenzungsreduktion

ini_set('memory_limit', '256M'); 

if(isset($_POST)) { 
    ############ Edit settings ############## 
    $ThumbSquareSize  = 200; //Thumbnail will be 200x200 
    $ThumbPrefix   = "thumbs/"; //Normal thumb Prefix 
    $DestinationDirectory = '../../../uploads/general/'; //specify upload directory ends with/(slash) 
    $PortfolioDirectory = '../../../images/portfolio/'; 
    $Quality    = 100; //jpeg quality 
    ########################################## 

    $imID = intval($_POST['imageID']); 
    $image = $_POST['image']; 
    $data = $image['data']; 
    $name = $image['name']; //get image name 
    $width = $image['width']; // get original image width 
    $height = $image['height'];// orig height 
    $type = $image['type']; //get file type, returns "image/png", image/jpeg, text/plain etc. 
    $desc = $image['desc']; 
    $album = intval($image['album']); 
    $customer = intval($image['customer']); 
    $tags = $image['tags']; 
    $allTags = $_POST['allTags']; 
    $portType = intval($image['portType']); 
    $rating = intval($image['rating']); 
    $imData = array(); 

    if(strlen($data) < 500) { 
     $dParts = explode('?', $data); 
     $path = $dParts[0]; 
     $base64 = file_get_contents($path); 
     $data = 'data:' . $type . ';base64,' . base64_encode($base64); 
    } 

    function base64_to_jpeg($base64_string, $output_file) { 
     $ifp = fopen($output_file, "wb"); 

     $data = explode(',', $base64_string); 

     fwrite($ifp, base64_decode($data[1])); 
     fclose($ifp); 

     return $output_file; 
    } 

    function base64_to_png($base64_string, $output_file) { 

     $img = str_replace('data:image/png;base64,', '', $base64_string); 
     $img = str_replace(' ', '+', $img); 
     $data = base64_decode($img); 

     $im = imagecreatefromstring($data); 
     if ($im !== false) { 
      imagepng($im, $output_file); 
      imagedestroy($im); 
     } 

     return $output_file; 
    } 


    if($stmt = $db -> prepare("UPDATE `images` SET name = ?, type = ?, description = ?, width = ?, height = ?, rating = ?, portType = ?, customer = ?, album = ?, dateModified = NOW() WHERE ID = ?")) { 


     $stmt -> bind_param("sssiiiiiii", $name, $type, $desc, $width, $height, $rating, $portType, $customer, $album, $imID); 

     if (!$stmt->execute()) { 
      echo false; 
     } else { 


      $delTags = "DELETE FROM tagLink WHERE imageID = $imID"; 
      if(!$db->query($delTags)) { 
       echo $db->error; 
      } 

      if(sizeof($tags) > 0) { 
       foreach($tags as $tag) { 
        $tagQ = "INSERT INTO tagLink (imageID, tag) VALUES ($imID, '$tag')"; 
        if(!$db->query($tagQ)) { 
         echo $db->error; 
        } 
       } 
      } 

      switch(strtolower($type)) 
      { 
       case 'png': 
        $fname = $name . '(' . $imID . ').png'; 
        $file = $DestinationDirectory . $fname; 
        $portfile = $PortfolioDirectory . $fname; 
        $thumbDest = $DestinationDirectory . $ThumbPrefix . $fname; 
        $CreatedImage = base64_to_png($data,$file); 

        break; 
       case 'jpeg': 
       case 'pjpeg': 
       case 'jpeg': 

        $fname = $name . '(' . $imID . ').jpeg'; 
        $file = $DestinationDirectory . $fname; 
        $portfile = $PortfolioDirectory . $fname; 
        $thumbDest = $DestinationDirectory . $ThumbPrefix . $fname; 
        $CreatedImage = base64_to_jpeg($data,$file); 

        break; 
       default: 
        die('Unsupported File!'); //output error and exit 
      } 

      array_push($imData, $imID); 
      array_push($imData, $name); 
      array_push($imData, $type); 
      array_push($imData, $portType); 


      echo json_encode($imData); 

      if(!cropImage($width,$height,$ThumbSquareSize,$thumbDest,$CreatedImage,$Quality,$type)) 
      { 
       echo 'Error Creating thumbnail'; 
      } 


     } 

     $stmt -> close(); 


    } else { 
    /* Error */ 
    printf("Prepared Statement Error: %s\n", $db->error); 
    } 

     /* Close connection */ 
    $db -> close(); 

    include '../cron/updatePortfolio.php'; 



} 


//This function corps image to create exact square images, no matter what its original size! 
function cropImage($CurWidth,$CurHeight,$iSize,$DestFolder,$SrcImage,$Quality,$type) 
{ 
    //Check Image size is not 0 
    if($CurWidth <= 0 || $CurHeight <= 0) 
    { 
     return false; 
    } 

    if($CurWidth>$CurHeight) 
    { 
     $y_offset = 0; 
     $x_offset = ($CurWidth - $CurHeight)/2; 
     $square_size = $CurWidth - ($x_offset * 2); 
    }else{ 
     $x_offset = 0; 
     $y_offset = ($CurHeight - $CurWidth)/2; 
     $square_size = $CurHeight - ($y_offset * 2); 
    } 


    switch(strtolower($type)) 
    { 
     case 'png': 
     $imageX = imagecreatefrompng ($SrcImage); 
     break; 
     case 'jpeg': 
     case 'pjpeg': 
     case 'jpeg': 
     $imageX = imagecreatefromjpeg ($SrcImage); 
     break; 
     default: 
     return false; 
    } 



    $NewCanves = imagecreatetruecolor($iSize, $iSize); 
    if(imagecopyresampled($NewCanves, $imageX, 0, 0, $x_offset, $y_offset, $iSize, $iSize, $square_size, $square_size)) 
    { 
     switch(strtolower($type)) 
     { 
      case 'png': 
       imagepng($NewCanves,$DestFolder); 
       break; 
      case 'jpeg': 
      case 'pjpeg': 
      case 'jpeg': 
       imagejpeg($NewCanves,$DestFolder,$Quality); 
       break; 
      default: 
       return false; 
     } 

     if(is_resource($NewCanves)) { 
      imagedestroy($NewCanves); 
     } 

     return true; 

    } 

} 
+0

Was könnte sauberer sein. Sie haben ein Skript, das zusätzlichen Speicher erfordert, und Sie haben dieses Skript geändert, um den erforderlichen Speicher zu ermöglichen. – RiggsFolly

+0

Sie haben die Fähigkeit zu inc Speicher eingekapselt und es dokumentiert sich selbst – RiggsFolly

+0

Ich hatte nur gehofft, es gab einige offensichtliche Speicherleck, die ich vermisste, die die große Speichernutzung verursacht. Ist es üblich, dass ein 8MB-Upload von Bildern 256 MB Speicher erfordert? –

Antwort

-1

Blick in die php.ini bei

upload_max_filesize = 40M 
post_max_size = 40M 

ändern 40M auf Ihre maximale Größe

+0

Die Frage gibt an, dass das Problem bei 'memory_limit' liegt und mit' ini_set ('memory_limit', '256M') behoben wird. 'Was hat' upload_max_filesize' oder 'post_max_size' mit dieser Frage zu tun? – RiggsFolly