05. januar 2007 - 18:35
Der er
15 kommentarer og 1 løsning
While trækker vildt meget
Hej Eksperter Jeg har lavet et script som behandler nogle billeder, men er blive lidt bange for at det vil tage for meget server kræft at kører det. Dette er enda kun en lille del af det system vi er ved at udvikle. Systemet skal tage alle billeder i en mappe og lave thumbs af dem, men når jeg tester den på min computer med 3.0 Ghz, 1024 DDR RAM så trækker det 50% af cpuen i omring 30 sekunder, for at lave 29 billeder. Så mit spørgsmål er om der er en måde at optimere følgende kode på? while (false !== ($file = readdir($handle))) { if((substr($file, -4) == '.jpg') || (substr($file, -5) == '.jpeg') || (substr($file, -4) == '.JPG') || (substr($file, -5) == '.JPEG')) { if (($file != '.') && ($file != '..')) { $i++; $res[] = $file; //Lav thumb list($width, $height) = getimagesize($dir.'/'.$file); $newheight = 100; $ratio = ($height / $width); $newwidth = round(($newheight / $ratio)); $source = imagecreatefromjpeg($dir.'/'.$file); $picture = imagecreatetruecolor($newwidth, $newheight); $newname = $i.'_'.$date.'.jpg'; $destination = 'images/pictures/thumbs/'.$_SESSION['insertid'].'/'.$newname; imagecopyresampled($picture, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($picture, $destination, 100); //Lav billedet rigtige størrelse //Skriv på billedet //Flyt til rigtige mappe //Slet orginalerne //Slet mappen UPLOAD_BILLEDERNE_HER //Gå til forsiden } } }
Annonceindlæg fra Barco
Er jeres mødelokaler sikre nok?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
05. januar 2007 - 20:05
#1
Ved ikke helt om det kan gøre hurtigere, men der er en (mindre) fejl i scriptet. Din $i++ skal være til sidst, for ellers $newname = $i.'_'.$date.'.jpg'; blive een højere end den er... Det er bare en mindre detalje. $i=0; while (false !== ($file = readdir($handle))) { if((substr($file, -4) == '.jpg') || (substr($file, -5) == '.jpeg') || (substr($file, -4) == '.JPG') || (substr($file, -5) == '.JPEG')) { if (($file != '.') && ($file != '..')) { $res[] = $file; //Lav thumb list($width, $height) = getimagesize($dir.'/'.$file); $newheight = 100; $ratio = ($height / $width); $newwidth = round(($newheight / $ratio)); $source = imagecreatefromjpeg($dir.'/'.$file); $picture = imagecreatetruecolor($newwidth, $newheight); $newname = $i.'_'.$date.'.jpg'; $destination = 'images/pictures/thumbs/'.$_SESSION['insertid'].'/'.$newname; imagecopyresampled($picture, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($picture, $destination, 100); //Lav billedet rigtige størrelse //Skriv på billedet //Flyt til rigtige mappe //Slet orginalerne //Slet mappen UPLOAD_BILLEDERNE_HER //Gå til forsiden $i++; } } } Sådan ;o)
05. januar 2007 - 20:06
#2
Fik skrevet forkert... Jeg ved det ikke gør det hurtigere. :o) Men ville bare pointere fejlen...
05. januar 2007 - 20:28
#3
nej min i skal være først fordi den starter på 0.
05. januar 2007 - 21:06
#4
Hvor store er din originalbilleder? Højde/bredde og fysisk størrelse?
05. januar 2007 - 21:25
#5
op til 1600x1400 og større, men de fylder maks 300 kb pr. stk.
06. januar 2007 - 09:56
#6
GDLib til transformation af mange billeder vil tage lang tid, og bruge så mange resourcer som muligt. Men kigger lige på en optimization.
06. januar 2007 - 10:13
#7
<?php function createThumbnail($image,$save) { list($width,$height) = getimagesize($image); $ratio = ($height / $width); $newHeight = 100; $newWidth = round(($newHeight/$ratio)); $source = imagecreatefromjpeg($image); $newImage = imagecreatetruecolor($newWidth,$newHeight); imagecopyresampled($newImage,$source,0,0,0,0,$newWidth,$newHeight,$width,$height); imagejpeg($newImage,$save,100); imagedestroy($newImage); } $directory = 'images/pictures'; $images = glob($directory.'/*.*'); $extensions = array('jpg','jpeg'); $date = date('d_m_Y'); foreach($images as $key=>$image) { $ext = substr($image,strrpos($image,'.')+1); if(!in_array(strtolower($ext),$extensions)) { continue; } $dir = $directory.'/thumbs/'.$_SESSION['insertid']; $save = sprintf('%s/%d_%s.jpg',$dir,$key,$date); if(!is_dir($dir)) { mkdir($dir,0777); } createThumbnail($image,$save); } ?>
06. januar 2007 - 10:16
#8
imagedestroy($newImage); skal være imagedestroy($newImage); imagedestroy($source); Man skal jo rydde pænt op :-)
06. januar 2007 - 10:18
#9
Forskel forklaret: 1) funktioner, ikke kode direkte i loops! ser pænere ud, men tager ligeså lang tid i teorien 2) glob() , cacher billederne i et array istedet for at lave konstant directory reading 3) array med extensions i, husk.. redudant kode er en dum ide, og kode i et loop tæller næsten som redudant kode. 4) oprydning i hukommelsen via. imagedestroy 5) mkdir ;) så mapperne oprettelse.
06. januar 2007 - 18:02
#10
Cool windcape. Jeg har ikke prøvet koden endnu, da jeg kommer til at se jeg mangler noget. Når den henter billederne ud fra mappen, så skal de sorteres med natsort() og først derefter behandles. Dette skal gøres for at billederne skal komme i rigtig række følge. Vi har haft problemer med at den gjorde det i denne rækkefølge: 1 10 11 12 .. 2 20 osv.
08. januar 2007 - 02:48
#11
hvorfor skal den sortere billederne mens den kører ? virker lidt meningsløst, da den alligevel tager alle thumbnails. natsort() vil fixe så den bliver 1,2,3 istedet for 1,10,2,3
10. januar 2007 - 15:31
#12
Ja den skal sortere billederne inden whilen køres fordi billederne skal komme i kronologisk rækkefølge
10. januar 2007 - 15:32
#13
Også når du gør sådan her: $directory = 'images/pictures'; $images = glob($directory.'/*.*'); Henter den så ikke alle mapperne i pictures?
11. januar 2007 - 11:28
#14
nej :-) altså medmindre dine mapper har et punktum i navnet :p (hint: "*.*")
12. januar 2007 - 11:43
#15
Skal vi ikke sige at du smider et svar nu også leger jeg med det når vi begynder at kode version 2?
21. januar 2007 - 00:10
#16
moooooooooooooooo :-)
Vi tilbyder markedets bedste kurser inden for webudvikling