/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Fejl ved mit galleriscript...
Fra : Jeppe Christensen


Dato : 23-05-07 15:03

Hej NG..

Jeg går følgende fejl i mit galleriscript:
<br />
<b>Fatal error</b>: Allowed memory size of 16777216 bytes
exhausted (tried to allocate 11200 bytes) in
<b>/customers/gie04-05.dk/gie04-05.dk/httpd.www/skitur/include/ga
lleri.php</b> on line <b>40</b><br />

Når jeg uploader billeder som fylder omkring 1 mb og derover...

Har snakket med one som hoster for mig, og de tillader en upload
på op til 12 mb så det er ikke der fejlen ligger...

Anyway linje 40 ser således ud:

$image = imagecreatefromjpeg($position);

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Bertel Lund Hansen (23-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 23-05-07 15:05

Jeppe Christensen skrev:

> <b>Fatal error</b>: Allowed memory size of 16777216 bytes
> exhausted (tried to allocate 11200 bytes) in

Du mangler formodentlig at frigive noget hukommelse løbende.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Peter Brodersen (23-05-2007)
Kommentar
Fra : Peter Brodersen


Dato : 23-05-07 15:38

On 23 May 2007 14:02:43 GMT, Jeppe Christensen
<mr.puity@nospamgmail.com> wrote:

>Jeg går følgende fejl i mit galleriscript:
><br />
><b>Fatal error</b>: Allowed memory size of 16777216 bytes
>exhausted (tried to allocate 11200 bytes) in
><b>/customers/gie04-05.dk/gie04-05.dk/httpd.www/skitur/include/ga
>lleri.php</b> on line <b>40</b><br />
>
>Når jeg uploader billeder som fylder omkring 1 mb og derover...

Selve billedet fylder måske kun 1 MB i komprimeret form, men for at
arbejde på billederne med GD-funktionerne, skal de pakkes ud i rå
form.

Et 1 MB jpeg-billede på fx 1600x1200 pixels i 24 bit fylder ca. 5,5
megabytes (1600 * 1200* 24 bits) i råt format - muligvis mere, hvis
der også tilføjes en alphakanal i den rå udgave. Skal man lave en
arbejdskopi, hvor man skal lægge noget sammen fra et andet billede,
kommer man måske op på det dobbelte. Jeg kunen forestille mig, at
imagecreatefromjpeg() ligeledes tager en rå kopi, som der arbejdes på.
Så kommer man hurtigt deropad, og 16 MB er ikke meget at have til
rådighed i alt, med dagens billedestørrelse.

Det kan være, du kan frigøre noget hukommelse ved at unset()'e de
image-ressourcer, du er færdig med at bruge.

--
- Peter Brodersen
Kendt fra Internet

Jeppe Christensen (23-05-2007)
Kommentar
Fra : Jeppe Christensen


Dato : 23-05-07 22:50

> Det kan være, du kan frigøre noget hukommelse ved at unset()'e de
> image-ressourcer, du er færdig med at bruge.

Mange tak for svaret, men hvordan skal denne unset() funktion sættes ind
og med hvad argument i parentesen?..


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Peter Brodersen (23-05-2007)
Kommentar
Fra : Peter Brodersen


Dato : 23-05-07 23:52

On 23 May 2007 21:49:50 GMT, Jeppe Christensen
<mr.puity@nospamgmail.com> wrote:

>> Det kan være, du kan frigøre noget hukommelse ved at unset()'e de
>> image-ressourcer, du er færdig med at bruge.
>
>Mange tak for svaret, men hvordan skal denne unset() funktion sættes ind
>og med hvad argument i parentesen?..

Hvis du har flere tidligere billed-ressourcer i scriptet, som du gør
noget ved, fx:

$billede = imagecreatefromjpeg("pic.jpg");
$billede2 = imagecreatefromjpeg("pic2.jpg");
// og noget behandling af de to ressourcer

.. og du så er færdig med at behandle dem, så kan du tømme indholdet af
ressourcerne $billede og $billede2 med fx:
unset($billede);
unset($billede2);

Men igen, hvis du ikke bruger noget egentligt hukommelse, og det kun
er det ene billede, du prøver at indlæse, så er der ikke noget at gøre
- så tillader den PHP-installation slet og ret for lidt hukommelse.

Jeg er personligt stadigvæk overrasket over hosts, der sætter grænsen
så lavt i disse dage. Grænsen har slet ikke fulgt med udviklingen af
serverkapacitet og bruger-behov i øvrigt, men jeg tror, at der er
nogle udbydere, som misforstår indstillingen, og tror, at serveren
*vil* kræve mere RAM, hvis grænsen sættes op til fx 64 MB.

--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (24-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-05-07 08:01

Peter Brodersen skrev:

> . og du så er færdig med at behandle dem, så kan du tømme indholdet af
> ressourcerne $billede og $billede2 med fx:
> unset($billede);
> unset($billede2);

Jeg har et script der er snuppet et eller andet sted fra hvor
billederne nedlægges sådan:

   imagedestroy($src_image);

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Martin (24-05-2007)
Kommentar
Fra : Martin


Dato : 24-05-07 08:48

Bertel Lund Hansen wrote:
> Peter Brodersen skrev:
>
>> . og du så er færdig med at behandle dem, så kan du tømme indholdet af
>> ressourcerne $billede og $billede2 med fx:
>> unset($billede);
>> unset($billede2);
>
> Jeg har et script der er snuppet et eller andet sted fra hvor
> billederne nedlægges sådan:
>
>    imagedestroy($src_image);
>

Som også er den korrekte måde.
unset fjerner faktisk kun indholdet i variablen, mens billedet stadig
vil ligge i hukommelsen.

En helt anden ting - engang imellem hvis man fx. bruger

$image1 = imagecreatefrompng(...);
$image2 = imagecreatefrompng(...);

Så kan der ske nogle uventede ting med billederne, hvorfor... det må
guderne vide :)

Så husk ALTID at "ødelægge" et billede, når man er færdigt med det

Bertel Lund Hansen (24-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-05-07 10:18

Martin skrev:

>>    imagedestroy($src_image);

> Som også er den korrekte måde. unset fjerner faktisk kun
> indholdet i variablen, mens billedet stadig vil ligge i
> hukommelsen.

Jeg kan tilføje at jeg har brugt scriptet til at resize ca. 1000
billeder på ca. 1 Mbyte pr. stk. uden andre problemer end
time-out.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Peter Brodersen (24-05-2007)
Kommentar
Fra : Peter Brodersen


Dato : 24-05-07 13:43

On Thu, 24 May 2007 09:47:59 +0200, Martin <news@natten-i.dk> wrote:

>> Jeg har et script der er snuppet et eller andet sted fra hvor
>> billederne nedlægges sådan:
>>
>>    imagedestroy($src_image);
>Som også er den korrekte måde.
>unset fjerner faktisk kun indholdet i variablen, mens billedet stadig
>vil ligge i hukommelsen.

Jeg mente nok at der var en funktion til det, og tvivlede selv om
unset() var god nok. Derfor testede jeg mit udsagn af samme grund

<?php
print memory_get_usage()."\n";
$id=imagecreatetruecolor(1600,1200);
print memory_get_usage()."\n";
unset($id);
print memory_get_usage()."\n";'
?>

... giver:

52240
9727204
52672

Så hukommelsen bliver frigivet ved unset() i det her tilfælde og selve
variablen bliver også frigjort. Ved imagedestroy() fortsætter
variablen med at være en ressource, som dog ikke er tilknyttet til
noget. Det kan så også være at foretrække af hensyn til overblikket.

Men jeg er fuldstændigt enig i, at det er langt mere hensigtsmæssigt
(og gennemskueligt) at bruge de tilhørende funktioner i de forskellige
extensions. imagedestroy() er måden at gøre det på.

>En helt anden ting - engang imellem hvis man fx. bruger
>
>$image1 = imagecreatefrompng(...);
>$image2 = imagecreatefrompng(...);
>
>Så kan der ske nogle uventede ting med billederne, hvorfor... det må
>guderne vide :)

Det er ikke noget, jeg har oplevet. Hvilke uventede ting? Det kunne
godt tyde på en eller anden simpel GD-bug, som nok er fixet i de
nyeste udgaver.

--
- Peter Brodersen
Kendt fra Internet

Martin (25-05-2007)
Kommentar
Fra : Martin


Dato : 25-05-07 11:42

Peter Brodersen wrote:
> Det er ikke noget, jeg har oplevet. Hvilke uventede ting? Det kunne
> godt tyde på en eller anden simpel GD-bug, som nok er fixet i de
> nyeste udgaver.

Jeg har aldrig selv fået den fejl, men jeg har set fejlen på et system
som jeg skulle laves nogle ændringer til - Det der skete var at GD lagde
de 2 billeder sammen til et, på en eller anden uforklarlig måde.

Det var dog kun 1-2 gange ud af et par tusinde gange den gjorde det.
Som om den ikke var færdig med at læse den første imagecreatefrom.. før
den begyndte på den næste - og fik blandet de 2 billeder sammen

Det var på en PHP 4.2 med GDlib 2 - Præcis version af GDlib kan jeg ikke
komme nærmere på - da det for længst er ude af verdenden.

Jeppe Christensen (24-05-2007)
Kommentar
Fra : Jeppe Christensen


Dato : 24-05-07 14:13

>    imagedestroy($src_image);

Hej, mange tak for hjælpen...

her er et lille udsnit af mit script:
      $width_big = 700;
      $height_big = 500;
      
      header('Content-type: $mime');
      
      list($width_orig, $height_orig) = getimagesize($position);
      
      if ($width_big && ($width_orig < $height_orig)) {
   $width_big = ($height_big / $height_orig) * $width_orig;
      } else {
   $height_big = ($width_big / $width_orig) * $height_orig;
      }
      
      $image_p = imagecreatetruecolor($width_big, $height_big);
      
      $image = imagecreatefromjpeg($position);
      
      imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width_big, $height_big,
$width_orig, $height_orig);
      
      imagejpeg($image_p, $positionBig, 100);

Skal lige have hjælp med hvor jeg skal sætte imagedestroy() ind så det
virker, har prøvet men kan ikke helt få den til at gøre som jeg vil..


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (24-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-05-07 17:04

Jeppe Christensen skrev:

>       imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width_big, $height_big,
> $width_orig, $height_orig);

Der dannedes billedet.

>       imagejpeg($image_p, $positionBig, 100);

Der blev det sendt af sted. Nedlæg det bagefter.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Jeppe Christensen (24-05-2007)
Kommentar
Fra : Jeppe Christensen


Dato : 24-05-07 18:48

> >       imagejpeg($image_p, $positionBig, 100);
>
> Der blev det sendt af sted. Nedlæg det bagefter.

Okay har lagt koden op til download:

http://gie04-05.dk/skitur/galleri.phps

Og får stadigvæk denne fejl:
<br />
<b>Warning</b>: imagedestroy(): supplied argument is not a valid Image resource
in
<b>/customers/gie04-05.dk/gie04-05.dk/httpd.www/skitur/include/galleri.php</b>
on line <b>40</b><br />
<br />
<b>Fatal error</b>: Allowed memory size of 16777216 bytes exhausted (tried to
allocate 11200 bytes) in
<b>/customers/gie04-05.dk/gie04-05.dk/httpd.www/skitur/include/galleri.php</b>
on line <b>42</b><br />

Kan du evt. fortælle mig helt præcis hvor den skal stå og hvad den skal
ødelægge...

På forhånd tak...


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (24-05-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-05-07 19:34

Jeppe Christensen skrev:

> Okay har lagt koden op til download:

Prøv at indsætte det her, men det er jo helt utestet:

   $image_p = imagecreatetruecolor($width_big, $height_big);
   $image = imagecreatefromjpeg($position);

   // Bemærk NOT (!):
   if (!imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width_big, $height_big, $width_orig, $height_orig)) {
      imagedestroy($image);
      imagedestroy($image_p);
      echo "Billedet kunne ikke genereres.";
   else {
      imagedestroy($image);
      if (imagejpeg($image_p, $positionBig, 100)) {
         imagedestroy($image_p);
         echo "Billedet burde være okay.";
      }
      imagedestroy($image_p);
   }
   $width = 100;
   $height = 100;


--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste