webForumDet fria alternativet

timeout vid skapande av tumnaglar

PHPur PHP

8 svar · 277 visningar · startad av greymane

Medlem sedan juli 2001711 inlägg
Frågan#1

jag använder följande skript för generering av tumnaglar:

<?

// scalePic(infil, utfil, max X-storlek, max Y-storlek, kvalitet (0-100));

function scalePic($filnamn, $nyttfilnamn, $maxX, $maxY, $kvalitet = 75) {
    $im = ImageCreateFromJPEG($filnamn);
    
	
    $im_width=imageSX($im);
    $im_height=imageSY($im);
    
    if ($maxX > $maxY) {
        $factor = $maxX/$im_width;
        $new_width = $maxX;
        $new_height = $im_height * $factor;
        }
    else {
        $factor = $maxY/$im_width;
        $new_width = $maxY;
        $new_height = $im_height * $factor;
        }
    
    // resize
    $new_im=imagecreatetruecolor($new_width,$new_height);
     ImageCopyResampleBicubic($new_im,$im,0,0,0,0,$new_width,$new_height,$im_width,$im_height);

    // output
    Imagejpeg($new_im,$nyttfilnamn,$kvalitet); // quality 75
        
    // cleanup
    ImageDestroy($im);
    ImageDestroy($new_im);
    }

    
function ImageCopyResampleBicubic ($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h)
/*
port to PHP by John Jensen July 10 2001 -- original code (in C, for the PHP
GD Module) by [email]jernberg@fairytale.se[/email]
*/
{
    for ($i = 0; $i < 256; $i++) {  // get pallete. Is this algoritm correct?
        $colors = ImageColorsForIndex ($src_img, $i);
        ImageColorAllocate ($dst_img, $colors['red'], $colors['green'], $colors['blue']);
    }

    $scaleX = ($src_w - 1) / $dst_w;
    $scaleY = ($src_h - 1) / $dst_h;

    $scaleX2 = $scaleX / 2.0;
    $scaleY2 = $scaleY / 2.0;

    for ($j = $src_y; $j < $dst_h; $j++) {
        $sY = $j * $scaleY;

        for ($i = $src_x; $i < $dst_w; $i++) {
            $sX = $i * $scaleX;

            $c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
            $c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
            $c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
            $c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));

            $red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4);
            $green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4);
            $blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4);

            $color = ImageColorClosest ($dst_img, $red, $green, $blue); 
            ImageSetPixel ($dst_img, $i + $dst_x, $j + $dst_y, $color); 
        }
    }
}

?>

När jag anropar skriptet får jag följande fel:

Fatal error: Maximum execution time of 30 seconds exceeded in /home/ServerRoots/www/album/gd_source.php on line 60

Raderna kring 60:

            $c1 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY + $scaleY2));
            $c2 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX, (int) $sY));
            $c3 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2));
            $c4 = ImageColorsForIndex ($src_img, ImageColorAt ($src_img, (int) $sX + $scaleX2, (int) $sY));

vad beror det på? finns nåt sätt att få fram ngn debugginginfo? ImageColorsForIndex() samt ImageColorAt() har jag provat var för sig utan att kunna reproducera felet.

/r
under tiden jag kör php-filen tar apache drygt 90 % av cpu:n. någonting är ju märkligt här! :)

Medlem sedan dec. 1999757 inlägg
#2

Jag förstår inte rikitgt varför man gjort funktionen ImageCopyResampleBicubic() Det ser jobbigt ut att bara titta på den.
Går det inte lika bra att använda imagecopyresampled eller är det något speciellt du är ute efter mer än att bara skala bilden?

Medlem sedan juli 2001711 inlägg
#3

ingen aning :) jag har bara kopierat funktionen. Jag vill minnas att det var Mungo som gav mig funktionen. Är det bara att byta ut funktionerna rakt av eller?

Medlem sedan dec. 1999757 inlägg
#4

Ok, jag tror det finns massor av skript här i forumet som skalar bilder om man söker. Gjorde ett själv för inte så länge sedan.
http://www.webforum.nu/showthread.php?forumid=23&threadid=116443

Medlem sedan mars 2003429 inlägg
#5

En ren gissning (har aldrig sett felet innan) Kan det inte vara så att din funktion är för "tung" för där sidan ligger, t.ex. om den ligger på ett webbhotell som har begränsat användarna till användandet av processorn så man bara får använda processorn i 30sec? som sagt ingen aning

Medlem sedan juli 2001711 inlägg
#6

ja jag ska nog ta och kika på lite alternativ. Det är bara det att jag har använt funktionen innan, den gången på ett kommersiellt webbhotell, nu kör jag det på min egen server.

skriptet ska inte vara för tungt, inte såå tungt iaf. Jag har ju som sagt kört det innan. Jag ändrade timeouten till 90 sekunder. 90 sekunder för att skala en bild på en knapp megabyte tycker jag låter väldigt mycket.

Medlem sedan juli 2001711 inlägg
#7

jag har nu provat skriptet på ett webhotell med lyckat resultat. Hotellet kör en P4 2,6 ghz. Själv kör jag en Celeron 433 mhz. Är det där skon klämmer? Är skriptet verkligen så resurskrävande? Jag har ingen aning själv, hur tungt är det att modifiera en bild?

Medlem sedan mars 2001484 inlägg
#8

Jag använder själv samma script, och visst brukar det ta ett par sekunder innan tumnageln skapats på servern. Tyvärr känner jag inte till någon prestanda för webbhotellet jag använder.

Loopar du funktionen för att göra om flera bilder på en gång? I så fall kan du överväga att minska antalet bilder som ska förminskas per körning.

Medlem sedan juli 2001711 inlägg
#9

nej, jag kör bara en bild i taget. några sekunder kan jag acceptera, men 90 blir lite väl mycket... finns det måntro nåt skript som är mindre krävande?

142 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)