Avatar billede cmau Nybegynder
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
                }
            }
        }
Avatar billede mcardle Nybegynder
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)
Avatar billede mcardle Nybegynder
05. januar 2007 - 20:06 #2
Fik skrevet forkert... Jeg ved det ikke gør det hurtigere. :o) Men ville bare pointere fejlen...
Avatar billede cmau Nybegynder
05. januar 2007 - 20:28 #3
nej min i skal være først fordi den starter på 0.
Avatar billede whatever Nybegynder
05. januar 2007 - 21:06 #4
Hvor store er din originalbilleder? Højde/bredde og fysisk størrelse?
Avatar billede cmau Nybegynder
05. januar 2007 - 21:25 #5
op til 1600x1400 og større, men de fylder maks 300 kb pr. stk.
Avatar billede windcape Praktikant
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.
Avatar billede windcape Praktikant
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);
}

?>
Avatar billede windcape Praktikant
06. januar 2007 - 10:16 #8
imagedestroy($newImage);

skal være

imagedestroy($newImage);
imagedestroy($source);

Man skal jo rydde pænt op :-)
Avatar billede windcape Praktikant
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.
Avatar billede cmau Nybegynder
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.
Avatar billede windcape Praktikant
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
Avatar billede cmau Nybegynder
10. januar 2007 - 15:31 #12
Ja den skal sortere billederne inden whilen køres fordi billederne skal komme i kronologisk rækkefølge
Avatar billede cmau Nybegynder
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?
Avatar billede windcape Praktikant
11. januar 2007 - 11:28 #14
nej :-)

altså medmindre dine mapper har et punktum i navnet :p (hint: "*.*")
Avatar billede cmau Nybegynder
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?
Avatar billede windcape Praktikant
21. januar 2007 - 00:10 #16
moooooooooooooooo :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

Seneste spørgsmål Seneste aktivitet
I dag 10:21 Ny printer, men hvilken Af mort1 i Printere
I går 19:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging