Ridimensionamento / riposizionamento dell'image PHP – Accelerazione

Ho scritto una piccola function per prendere un URL e ridimensionare l'image e memorizzarla sul mio locale, tuttavia lo script impiega circa 85 secondi per essere eseguito quando è necessario creare la cartella e .64 secondi su un ridimensionamento. Attualmente ho JPEG e PNG supportti come visto di seguito.

Mi chiedo se ci sia un metodo più veloce o qualcosa che sto facendo è troppo lungo, perché i tempi attuali per me sono inaccettabili, mi piacerebbe davvero farlo eseguire più velocemente.

Ogni pensiero / idea è molto apprezzato.

Grazie!

function getTime() { $timer = explode( ' ', microtime() ); $timer = $timer[1] + $timer[0]; return $timer; } function createThumb($thumb, $ids){ $start = getTime(); // File and new size $filename = $thumb; // Get new dimensions $img1 = getimagesize($filename); if ($img1[0] > $img1[1]) { $percentage = ('72' / $img1[0]); } else { $percentage = ('72' / $img1[1]); } $new_width = $img1[0] * $percentage; $new_height = $img1[1] * $percentage; // Resample $image_p = imagecreatetruecolor($new_width, $new_height); if($img1['mime']=='image/png'){ $image = imagecreatefrompng($filename); imagealphablending($image_p, false); imagesavealpha($image_p,true); $transparent = imagecolorallocatealpha($image_p, 255, 255, 255, 127); imagefilledrectangle($image_p, 0, 0, $new_width, $new_height, $transparent); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $img1[0], $img1[1]); } else { $image = imagecreatefromjpeg($filename); } imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $img1[0], $img1[1]); $imgPath = '/foo/bar/location/'.$ids; $imgName =''; //category, product, support if(!is_dir($imgPath)) { mkdir($imgPath, 0777); chmod($imgPath, 0777); } if(!is_file($imgPath."/index.html")){ $ourFileName = $imgPath."/index.html"; $ourFileHandle = fopen($ourFileName, 'w') or die("can't open file"); fwrite($ourFileHandle,'<html><body>401</body></html>'); fclose($ourFileHandle); } // Output if($img1['mime']=='image/png'){ $name = rand(1, 156406571337); $imgName = date("y_m_d_h_m_s").$name.'.png'; imagepng($image_p, $imgPath.'/'.$imgName); } else { $name = rand(1, 156406571337); $imgName = date("y_m_d_h_m_s").$name.'.jpg'; imagejpeg($image_p, $imgPath.'/'.$imgName, 100); } $end = getTime(); echo '<strong>createImage</strong>: '.round($end - $start,4).' seconden<br />'; exit; return $imgName; } 

Federico, sì, la libreria GD è semplicemente lenta. : – \ Suggerisco di utilizzare la libreria PHP ImageMagick. La syntax è super braindead semplice:

 $image = new Imagick('image.jpg'); $image->thumbnailImage(100,0); // 100px wide, 0 = preserve aspect ratio 

Spero che questa sia un'opzione per te.

In definitiva, la manipolazione delle immagini è un'azione che richiede molto tempo per la CPU. 0,64 secondi non è scandaloso su un'image di size decenti con qualsiasi mezzo. ImageMagick, come suggerito sopra, è probabile che sia un po 'più veloce, ma ci vorrà ancora molto più tempo dell'output di un po' di text.

Si noti che la class Imagick come hobodave menzionata non è disponibile nelle installazioni PHP precedenti alla 5.1.3 e richiede alless ImageMagick 6.2.4.

Se hai bisogno che la tua applicazione sia compatibile con le versioni precedenti, dovresti prendere in considerazione l'esecuzione di ImageMagick tramite la row di command.

Per eseguire gli eseguibili da row di command è ansible utilizzare l' operatore di backtick .