Avatar billede clausberg Nybegynder
07. november 2006 - 20:01 Der er 25 kommentarer og
1 løsning

Resize script - out of memory?

Hey
Jeg har et script der uploader billeder til et bibliotek (upload) og filnavnet på billedet + dertil hørende tekst til en mysql database. Scriptet er klassisk opbygget med formularfelter osv. Når man trykker på submit knappen, springer den til filen test.php.
$output .= '<form action="test.php" method="post" enctype="multipart/form-data">';


test.php:::::::::::::
<?php
function resize( $filename, $newfilename, $maxw, $maxh )
{
    $srcim = imagecreatefromjpeg( $filename );
    $ow = imagesx( $srcim );
    $oh = imagesy( $srcim );
    $wscale = $maxw / $ow;
    $hscale = $maxh / $oh;
    $scale = ( $hscale < $wscale ? $hscale : $wscale );
    $nw = round( $ow * $scale, 0 );
    $nh = round( $oh * $scale, 0 );
    $dstim = imagecreatetruecolor( $nw, $nh );
    imagecopyresampled( $dstim, $srcim, 0, 0, 0, 0, $nw, $nh, $ow, $oh );
    imagejpeg( $dstim, $newfilename, 85 );
    imagedestroy( $dstim );
    imagedestroy( $srcim );
    return file_exists($newfilename);
}
require('connect.php');

$allowedFiles = array('jpg');
$curDir      = getcwd();
$uploadDir    = '/upload/';
$output      = '<div id="centerDiv">';

if(isset($_POST['upload']) && $_FILES['myFile']['size'] > 0)
{
    $ext = strtolower(end(explode('.',$_FILES['myFile']['name'])));
    if(in_array($ext,$allowedFiles))
    {
        $design  = mysql_real_escape_string(strip_tags($_POST['mydesign']));
        $email  = mysql_real_escape_string(strip_tags($_POST['myemail']));
        $kategori  = mysql_real_escape_string(strip_tags($_POST['mykategori']));
        $header  = mysql_real_escape_string(strip_tags($_POST['myHeader']));
        $pris  = mysql_real_escape_string(strip_tags($_POST['mypris']));
        $comment = mysql_real_escape_string(strip_tags($_POST['myText']));
        $file = md5(uniqid(rand(), true)) . '.jpg';

        if(resize($_FILES['myFile']['tmp_name'], $curDir . $uploadDir . $file, 150, 150))
        {
            mysql_query("INSERT INTO tbl_716418(filename,design,email,kategori,header,pris,comment,added) VALUES('".$file."','".$session->username."','".$email."','".$kategori."','".$header."','".$pris."','".$comment."',NOW())") or die(mysql_error());
            $output .= 'Filen er uploadet<hr />';
        }
    }
}
?>

Hvis jeg prøver at uploade et meget stort billede, så får jeg fejlen:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 9216 bytes) in /customers/xxx.dk/xxx.dk/httpd.www/test.php on line 73

Linie 73 er::::
    $srcim = imagecreatefromjpeg( $filename );

Fejlen skulle vist skyldes, at scriptet bruger mere hukommelse end den har tilladelse til...
De billeder jeg uploader fylder meget mindre end den øverste grænse, som mit hotel har sat (16mb)
Avatar billede coderdk Praktikant
07. november 2006 - 22:24 #1
Men fordi det er JPEG så skal den også "decompresse" billedet og lave et bitmap i hukommelsen, og så fylder det pludseligt meget! ;)
Tag f.eks. mit 6Mpixel kamera, det laver billeder på 3072x2048, et jpeg er truecolor og kræver derfor (vist) 3 bytes per pixel, plus noget overhead... Det er over 18MB pr billede!
Avatar billede clausberg Nybegynder
07. november 2006 - 22:48 #2
crap!!!! Hvad gør jeg så... jeg kan se, at de eneste billeder jeg må uploade med dette script er billeder i størrelsesorden 1-2 mb... og det holder jo ikke.
Avatar billede clausberg Nybegynder
07. november 2006 - 22:49 #3
Jeg har ved flere tilfælde uploaded billeder på sider... og det var jpg billeder. Ligger problemet i mit script?
Avatar billede coderdk Praktikant
07. november 2006 - 23:11 #4
Ja og nej. Alle php-scripts der benytter GD vil have problemet. Du kan prøve at lave en google på php imagemagick convert resize - det kan være du kan komme udenom problemet ved brug af den - det kræver dig at din host har installeret imagemagick ;)
Avatar billede clausberg Nybegynder
07. november 2006 - 23:51 #5
jeg bruger one.com (b-one)... så jeg tvivler på at de har installeret imagemagick.

Jeg synes bare at det er mærkeligt. Der findes jo en milliard sider hvor man kan uplade billeder... jpg, som garanteret vel også fylder meget. Hvad gør de????

Har du kendskab til et andet resize script jeg kan afprøve.

Og hvad betyder GD???

Kunne en måde at løse problemet på, være at anvende thumbnails... eller det har måske ikke noget med det at gøre?
Avatar billede coderdk Praktikant
08. november 2006 - 00:09 #6
gd lib: http://www.boutell.com/gd/ det som php bruger til at behandle billeder med...

Du kan evt prøve at paste dette ind i en php-fil:

<?php echo "<pre>" . `convert` . "</pre>"; ?>

Så kan du se om de har imagemagick...
Avatar billede clausberg Nybegynder
09. november 2006 - 21:44 #7
Hvis jeg indsætter den linie du har forslået får jeg fejlen:
Warning: shell_exec() [function.shell-exec]: Cannot execute using backquotes in Safe Mode in /.... test.php
Avatar billede coderdk Praktikant
09. november 2006 - 22:07 #8
Ok, prøv:

<?php echo "<pre>"; passthru("convert"); echo "</pre>"; ?>
Avatar billede clausberg Nybegynder
09. november 2006 - 22:51 #9
Jeg får fejlen:
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 2155 bytes) in /customers

Måske sætter jeg <?php echo "<pre>"; passthru("convert"); echo "</pre>"; ?> det forkerte sted. Hvor skal jeg sætte den?
Avatar billede erikjacobsen Ekspert
09. november 2006 - 22:56 #10
Det er vel meget rimeligt at en webhoteludbyder sætter grænser for brug af RAM. 16MB er da ret godt - jeg kan se jeg har en på 7M - og een på 32 MB. Men man kan jo også have egen server, og sætte størrelsen til hvad man vil - så er der jo heller ikke andre at genere.

(b-)one.com er nok ikke til at forhandle med. Hvad med at lave billedet mindre før upload. Eller skift udbyder?
Avatar billede clausberg Nybegynder
09. november 2006 - 23:01 #11
erikjacobsen>>> jeg overvejer at skifte udbyder, men har ingen erfaring med valg af udbyder... kender kun one.com
Avatar billede coderdk Praktikant
09. november 2006 - 23:01 #12
clausberg, I en fil for sig selv, vil være fint :)
Avatar billede coderdk Praktikant
09. november 2006 - 23:02 #13
Det *er* nok de fleste ISP'er der har sådanne begrænsninger. Har dog ikke hørt noget godt om one.com (andet end de er billige).
Avatar billede clausberg Nybegynder
09. november 2006 - 23:06 #14
Thx...

dvs. jeg sætter
<?php echo "<pre>"; passthru("convert"); echo "</pre>"; ?>
ind i en ny fil med fx med navnet ny.php

og så include ny.php i test.php?
Avatar billede coderdk Praktikant
10. november 2006 - 01:45 #15
Nej, bare kald ny.php direkte og se hvad den skriver
Avatar billede clausberg Nybegynder
10. november 2006 - 12:11 #16
Jeg har forresten lige mailet med one.com.. de har ikke installeret imagemagick, men foreslår at jeg bruger GD2, som de har installeret. Giver det mening?????

jeg må indrømme, at jeg ingen ide har om GD teknologi? Jeg vil derfor blive meget glad for din hjælp :-)
Avatar billede coderdk Praktikant
10. november 2006 - 13:36 #17
GD er det du har brugt hele tiden ;) Alle image* funktionerne er fra gd-lib :)
Avatar billede clausberg Nybegynder
14. november 2006 - 13:20 #18
Jeg har været inde på http://www.boutell.com/gd/ og downloaded en zipfil indeholdende det jeg tror er GD2. Der står at man skal installere "programmet" - der er en vejledning i, hvordan jeg skal bruge det.

Jeg synes bare at der er underligt at jeg tilsyneladende skal installere noget på mit hotel for at bruge GD2... jeg troede at det lå indlejret i php?

Har du erfaring med filerne på http://www.boutell.com/gd/????????
Avatar billede coderdk Praktikant
14. november 2006 - 13:35 #19
Nej, du *KAN* sikkert ikke installere det på dit webhotel, det er noget der burde være i PHP (med mindre din webhost har valgt ikke at tage den med). Lav evt en php fil:

<?php phpinfo(8); ?>

og kigge efter gd, eller måske denne:

<?php

    ob_start();
    phpinfo(8);
    $result = preg_match( "#(<h2><a name=\"module_gd.*?</table>)#is",ob_get_contents(),$m) ? $m[1] : 'Fandt ikke GD';
    ob_clean();
    echo $result;

?>
Avatar billede coderdk Praktikant
14. november 2006 - 13:35 #20
I øvrigt HAR du gd, da du har imagejpeg() osv ;)
Avatar billede clausberg Nybegynder
14. november 2006 - 14:19 #21
Ok... One.com (mit hotel) har jo også skrevet til mig at de har installeret GD 2, og ikke imagemagic.

Når jeg kommer hjem i eftermiddag afprøver jeg det du netop har forslået...

Jeg er stadig i tvivl hvad jeg skal pille ved, for at få mit script til at virke.

Hvis vi går ud fra at mit hotel kører gd2, men at jeg med mit nuværende script ikke kan uploade billeder der fylder mere end 1.3 mb, ligger fejlen så i den del af mit script som handler om selve resize delen?
Avatar billede coderdk Praktikant
14. november 2006 - 14:37 #22
Det er serveropsætningen. Du er nødt til at gøre dine billeder lidt mindre, før du uploader dem. Der er ikke så meget andet at gøre..
Avatar billede clausberg Nybegynder
16. november 2006 - 08:32 #23
Ok. Vil løsningen være, at jeg opretter thumbnails af billederne?
Avatar billede coderdk Praktikant
16. november 2006 - 10:49 #24
Ja, enten så lav thumbnails på din egen maskine, eller gør originalbillederne lidt mindre så PHP kan håndtere dem...
Hvis du vil lave dem på din egen maskine, kan du nok bruge irfanview: www.irfanview.com - den kan lave thumbs ud af en masse billeder i ét hug...
Avatar billede clausberg Nybegynder
16. november 2006 - 17:49 #25
Jeg prøver lige at kigge lidt på thumbs
Smid et svar - og tak for hjælpen :-)
Avatar billede coderdk Praktikant
16. november 2006 - 17:58 #26
Ok :)
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