Fatal error: Allowed memory size of 20971520 bytes exhausted (tried to allocate 1734 bytes) in /home/httpd/html/www.brhel.info/dolomity/admin/a/galerie/fotky_add.php on line 38
Kdyz nahravam 4 obrazky najednou ve formatu JPG 1700x1100 přes webové rozhraní píše se tato chyba. Prosim co to znamena a jak by to slo vyresit?
max 2 MB, musis to nahrat po castiach
No problem ale je ze samotnej obrazek ma 413kb a paklize nahravam 4 najednou tak to stejne neda dohromady 2mb a pres to to hlasi chybu..
Opravdu nahráváš 4 obrázky a každý má 413kB? JPG je komprimovaný formát a velikosti obrázků se výrazně liší podle toho, co na nich je.
samotný upload není problém, horší je, když s tím obrázkem pracuješ pomocí image_xxx
Obrázek vytvořený v paměti z něčeho, co má 1700x1100 px je pak dost velký (při 16 bit hloubce bude mít obrázek skoro 4MB, předpokládám, že hloubka bude aspoň 32 bit, tj skoro 12MB. Plus režie navíc a už narážíš na limit, který je, předpokládám, na zdejším php stanoven na 20MB, jak praví chybová hláška. Takže: rušit obrázky v paměti? Rozumnější algoritmy? Nějak se s tím popereš.
Na WZ je memory_limit nastaven na 40M. Běžně PHP resizuji 3MPix fotky.
Příklady 3 Mpix fotek (2048 x 1536 px, 24bit/pixel):
Malá: 337kB na disku - 5,5 MB v paměti
Velká: 668kB na disku - 9MB v paměti
Tady asi problém nebude, obzvlášť, když chybové hlášce se jedná o 2MB limit.
Na WZ je 2MB limit nastaven:
post_max_size
upload_max_filesize
Tady bych zkusil zapátrat.
je to na jiném serveru.
Díky za všechny rady.
zbi, 20 MB limit a přímo tam v té hlášce je napsané, že jsi překročil povolený objem paměti....
SRI, přehlédl jsem se o řád! Za tou dvojkou bylo příliš čiselek. Provozuji nějaké domény na pípni.cz a tam je memory_limit jen 6MB. To je naprosto nepoužitelné pro jakoukoli image funkci už pro 2 Mpix fotku! Musím si vždy fotky zmenšovat na lokále na finální velikost, než je tam nahraji - hrůza.
Ještě, že na WZ je 40 MB.
zbi, v poho, jenom aby tazatel nebyl uveden v omyl, stejně si myslím, že tam má borderl ve skriptech....
MzM: když resampluješ několik fotek v jednom skriptu a důsledně neuvolňuješ paměť (ImageDestroy), tak dokážeš překročit jakýkoli memory_limit...
No tak to teda nevím jak už to přeskočit. ImageDestroy samozřejmě používám.
Tak díky všem za rady
Xili: Co máš za příkaz na řádku 38?
33 $in_name = "fotky/".$nahodna.$koncovka;
...
38 $in = ImageCreateFromJpeg($in_name);
Prakticky je to o tom že se obrázky nahrajou na web do galerie a vytvoří se malé náhledy.
Hmm, to je docela logické, že ti to klekne právě tady. PHP si alokuje paměť na operace s obrázky. U JPGů to jsou řádově MB.
Mám na WZ docela podobný skript (tvorba náhledů) a funguje bez problémů. Ale já vždy zpracovávám jen jednu fotku.
Zkus si ve svém skriptu na více místech treknout, kolik paměti ti to žere funkcí memory_get_usage().
http://us2.php.net/memory_get_usage
No jo ale jak by to šlo jinak udělat?
Jde o to že mám galerii.
Pak je tam odkaz pro přidání fotek. Fotky lze přidávat po 10,aby se nemuselo pořád vracet sem tam..
potíž je v tom že mně to hlásí i chybu u jednoho obrázku, který je v rozlišení 1789x1165. :-(
Dělá to, když tam pustíš tu jedinou fotku 1789x1165? Nebo, když zpracováváš několik fotek po sobě v jednom skriptu a sekne se to na této fotce?
nahrávám poze jednu fotku 1789x1165 a píše to chybu jakmile ji zmensim na 1700x1100 tak to je bez chyby a vse probehne dobre
Ta věta je zamotaná. Asi je dobré používat tečky na koncích vět.
Co jsi zkusil? Není ta fotka poškozená? Zkusil jsi větší fotku? Kolik máš volné paměti před ImageCreateFromJpeg?
Takhle jestliže nahrávám fotku 1789x1165 tak to napíše chybu.
Jakmile fotku zmensim na 1700x1100 vse je OK.
Fotka poškozená není zkoušel jsem to s více ve stejném rozlišení.
Volné paměti? No měla by být volná celá.
Prostě je tam problém s pamětí. Zkus ten memory_get_usage() úplně na začátku skriptu a potom před řádkem 38. Uvidíš, jak se mění alokace paměti.
Nezbývá ti než zkoušet, pátrat a zjišťovat.
Funguje ten tvůj skript s většími fotkami (třeba 3Mipx = 2048x1536)?
3mipx No nfunguje jelikos uz je to asi moc velky
No, takže jsi asi na hranici memory_limit.
Dle mého názoru máš následující možnosti.
1. Zoptimalizovat skript: důsledně rušit všechny nepotřebné proměnné (unset), rušit proměnné image (imagedestroy). Pokroky můžeš sledovat přes ten memory_get_usage().
2. Pokusit se zvýšit si memory_limit. Pokud je to tvůj server, nebo to není zakázáno, můžeš zkusit příkaz:
ini_set("memory_limit","40M"); nebo nastavit php.ini
Pravděpodobně to ale nepůjde.
3. Fotky před uploadem zmenšit na lokále (ušetříš aspoň čas uploadu).
Tak jo zitre se do toho pustim.
Diky vsem a hlavně zbi. ;-)