Avatar billede morpheus Nybegynder
04. december 2003 - 18:42 Der er 10 kommentarer og
1 løsning

Hjælp til optimering af thumb script

Hej,

I nat fik jeg lavet nedenstående kode.
Koden virker som sådan vældig fint, bortset fra at den trækker tænder ud på serveren, og jeg måtte ændre memory_limit fra 8MB til 22MB, for at scriptet kunne køre.

Nu søger jeg så lidt hjælp til at gøre scriptet lidt hurtigere, og bruge mindre ram.


<?php
include("class.php");
gallery::dbConn();
error_reporting(E_ALL);
if ($_GET['i']) {
    $res = mysql_query("SELECT ImgPath, ImgNameConv, ImgOrgHeight, ImgOrgWidth, ImgType FROM images WHERE ImgNameConv = '".$_GET['i']."'") or die(mysql_error());
    $path = mysql_result($res, 0, "ImgPath");
    $src = mysql_result($res, 0, "ImgNameConv");
    $orgw = mysql_result($res, 0, "ImgOrgWidth");
    $orgh = mysql_result($res, 0, "ImgOrgHeight");
    $type = mysql_result($res, 0, "ImgType");
    $width = $_GET['w'];
    $srcpath = $path."/".$src;
    $thpath = $path."/t_".$src;
    // Chek om der lavet en thumb og om den er med den rigtige vidde.
    $a = @getimagesize($thpath);
    if (file_exists($thpath) && $a[0] == $width) {
        header("Content-type: ".$type);
        $data = fread(fopen($thpath,"r"),filesize($thpath));
        print $data;
        exit;
    } else { // Hvis ikke, så laver vi den
        // laver beregninger på det nye billedes størrelse
        $mh = 0;
        $mw = 0;
        if ($orgh > $orgw) {
            $mh = 0;
            $mw = ($orgh-$orgw) / 2;
        }
        if ($orgh < $orgw) {
            $mw = 0;
            $mh = ($orgw-$orgh) / 2;
        }
        $m=$orgh;
        if ($orgw > $orgh) {
            $m = $orgw;
        }
        $img_in = imagecreatefromjpeg($srcpath);
        $img_tmp = imagecreatetruecolor($m,$m);
        $img_tmp_c = imagecopy($img_tmp,$img_in,$mw,$mh,0,0,$orgw,$orgh);
        $img_out = imagecreatetruecolor($width,$width);
        $img_out_c = imagecopyresized($img_out, $img_tmp, 0, 0, 0, 0, $width,$width,$m,$m);
        imagedestroy($img_in);
        imagedestroy($img_tmp);
        imagedestroy($img_tmp_c);
        imagedestroy($img_out_c);
        header("Content-type: ".$type);
        imagejpeg($img_out, "", 50);
        // new line
        imagejpeg($img_out, $thpath, 50);
        imagedestroy($img_out);
        exit;
    }
}
?>
Avatar billede danisher Nybegynder
04. december 2003 - 21:12 #1
Det lyder meget underligt, at dette skulle tage så mange resourcer, som du beskriver... Jeg har noget lignende kørende på min egen server, og ikke mindst b-one, og hvis det kan køre på b-one, så burde det også kunne køre på din computer...
Kan man få at vide, hvilken computer du har, og hvilket styresystem, server, php version osv.?

Mvh
Avatar billede morpheus Nybegynder
04. december 2003 - 21:52 #2
FreeBSD 5.1
PHP 4.3.4

Celeron 433MHz
128MB RAM
20GB disk

Kan jeg evt. se dit script?
Avatar billede danisher Nybegynder
04. december 2003 - 21:57 #3
Dette er funktionen:
function resize_img($imgname,$size)
{
    Header("Content-Type: image/jpeg");
    $image_stats = GetImageSize($imgname);
    $imagewidth = $image_stats[0];
    $imageheight = $image_stats[1];
    $img_type = $image_stats[2];
    $img_src = ImageCreateFromjpeg($imgname);

    $true_width = imagesx($img_src);
    $true_height = imagesy($img_src);

    if ($true_width>=$true_height) {
        $width=$size;
        $height = ($width/$true_width)*$true_height;
    }
    else {
        $height=$size;
        $width = ($height/$true_height)*$true_width;
    }
    $img_des = imagecreate($width,$height); // imagecreatetruecolor
    imagecopyresized($img_des, $img_src, 0, 0, 0, 0, $width, $height, $true_width, $true_height);
    return $img_des;
}
Avatar billede danisher Nybegynder
04. december 2003 - 21:57 #4
Dette er koden:
foreach ($_FILES as $tagname=>$object) {
    // get the temporary name (e.g. /tmp/php34634.tmp)
    $tempName = $object['tmp_name'];

    // get the real filename
    $realName = $object['name'];

    // where to save the file?
    $target = $tempDir;

    $ending = strtolower(substr($realName, strlen($realName)-4, 4));
    $navn = $i . $ending;
    $mid = $navn . ".tmp";

    //$tempPath = $_SERVER["DOCUMENT_ROOT"] . "/upload/" . $mid;
    $tempPath = realpath("../upload/") . "/" . $mid;


    // move the file to the target directory
    if (move_uploaded_file($tempName, $tempPath)) {
        $image_stats = GetImageSize($tempPath);
        $imagewidth = $image_stats[0];
        $imageheight = $image_stats[1];
        $img_type = $image_stats[2];
        $picture_location = $tempPath;        // picture location
        $picture_save = $uploaddir . "/" . $navn;            // picture save location
        $size = $imagewidth;

        if ($imagewidth > 600) {
            $size = 600;
        }

        $img_des=resize_img($picture_location,$size);
        imagejpeg($img_des, $picture_save);
        $url =  $serverUploadDir . "/" . $navn;

        $picture_save = $uploaddir . "/t." . $navn;            // picture save location
        $size = $imagewidth;
        if ($imagewidth > 150) {
            $size = 150;
        }
        $img_des=resize_img($picture_location,$size);
        imagejpeg($img_des, $picture_save);
        $thumb =  $serverUploadDir . "/t." . $navn;

        unlink($tempPath);
        mysql_query("INSERT INTO billeder (lid, url, thumb) VALUES('" . $_REQUEST["id"] . "', '" . $url . "', '" . $thumb . "')");
        print mysql_error();
    }
    else {
        $fejl = true;
    }
    $i++;
}
Avatar billede danisher Nybegynder
04. december 2003 - 21:59 #5
I funktionen står der
$img_des = imagecreate($width,$height); // imagecreatetruecolor
imagecreate er til GD lib før 2+, og den i kommentaren er så efter 2+
Avatar billede morpheus Nybegynder
04. december 2003 - 22:28 #6
Men der er en lille forskel på de 2 scripts.
Mit laver en kasse der er sort, hvori den ligger det resizede billede...
Avatar billede danisher Nybegynder
04. december 2003 - 22:37 #7
Ja, det er den her:
imagecreatetruecolor(width, height);

Det bruger jeg også. Som jeg skrev i mit sidste indlæg, kommer det an på hvilken version af PHP man har...

Men jeg må indrømme, at jeg ikke synes at en 433 mHz Celeron med 128MB ram ikke er den hurtigste maskine, men den burde vel nok kunne resize et par billeder.... Hvor mange billeder snakker vi om?
Avatar billede morpheus Nybegynder
05. december 2003 - 01:18 #8
jeg har pt. sat den til at vise 6 pr. side, men den er ok sløv om at vise dem, selvom thumbnail er lavet og det hele.

Værst er det dog når den resizer billeder på 1600x1200
Avatar billede danisher Nybegynder
05. december 2003 - 13:38 #9
Hmm... Har du eventuelt prøvet at ligge det på en public server, og så se, hvor meget guf den tager fra den server? Eventuelt kigge på, hvor længe den tager om at generere siden...

Ellers har jeg ingen ideer...
Mvh
Avatar billede morpheus Nybegynder
05. december 2003 - 13:49 #10
Det var også næste forsøg... Men det kræver lige nogen justeringer.
Avatar billede morpheus Nybegynder
22. januar 2005 - 14:07 #11
lukker
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