Nette\Image a paměť
- Teyras
- Člen | 81
Zdravím,
mám problém s třídou Nette\Image – při pokusu o úpravu JPEG obrázku
o velikosti 570 kB mi server vyhodí
Fatal error: Allowed memory size of 50331648 bytes exhausted (tried to allocate 15568 bytes)
Chyba je na řádku 103, tj. imagecreatefromjpeg().
Nechápu jak příčinu chyby, tak její text – alokací 15kB se snad
nevyčerpá 48MB paměti.
Je nějaká možnost jak to řešit?
- Jan Tvrdík
- Nette guru | 2595
Požádat hosting o zvýšení memory limit, pakliže ho nemůžeš zvětšit sám.
- David Grudl
- Nette Core | 8228
Pomocí Requirements Checker
si můžeš ověřit, jestli na serveru není k dispozici ImageMagick, tím by
se problém s velkými obrázky vyřešil (podpora ve frameworku se zapne přes
Image::$useImageMagick = TRUE
).
Jinak počítej s tím, že každý obrázek si ukousne cca (šířka × výška × 3 × 1.6) bajtů paměti.
- kutilm
- Člen | 21
David Grudl napsal(a):
… podpora ve frameworku se zapne přes
Image::$useImageMagick = TRUE
…
Použití se ale zapne jen pouze pro velké obrázky:
<?php
$info = @getimagesize($file);
if ( ... $info[0] * $info[1] > 2e6) ...
?>
Mám s tím drobet problém, nedala by se ta konstanta (2e6) nějak
modifikovat. Buďto dynamicky z nastavení serveru, nebo alespoň ručně
Image::$bigImage = 1e6
.
Konkrétně pro obrázek 1600×1200 se ImageMagick ještě nezapne, ale server s 16MB memory limit už hlásí „Fatal error: Allowed memory size …“
PS: Obejít se to samozřejmě dá tak, že si instanci ImageMagick objekt udělám přímo:
<?php
$image = new ImageMagick($file);
?>
ale není už to tak hezké. Dík
- RDPanek
- Člen | 189
kutilm napsal(a):
David Grudl napsal(a):
… podpora ve frameworku se zapne přes
Image::$useImageMagick = TRUE
…Použití se ale zapne jen pouze pro velké obrázky:
<?php $info = @getimagesize($file); if ( ... $info[0] * $info[1] > 2e6) ... ?>
Mám s tím drobet problém, nedala by se ta konstanta (2e6) nějak modifikovat. Buďto dynamicky z nastavení serveru, nebo alespoň ručně
Image::$bigImage = 1e6
.Konkrétně pro obrázek 1600×1200 se ImageMagick ještě nezapne, ale server s 16MB memory limit už hlásí „Fatal error: Allowed memory size …“
PS: Obejít se to samozřejmě dá tak, že si instanci ImageMagick objekt udělám přímo:
<?php $image = new ImageMagick($file); ?>
ale není už to tak hezké. Dík
co přesně znamená ta citace? jak se používá? Díky
- kutilm
- Člen | 21
Gaudentius napsal(a):
co přesně znamená ta citace? jak se používá? Díky
Ahoj,
nejsem si 100% jist jestli jsem porozuměl tvému příspěvku, ale
pomůže toto:
- Vyki
- Člen | 388
Nette pracuje s ImageMagickem po staru pomocí funkce exec
.
Velké množství hostingů má fci. exec z bezpečnostních důvodů(?)
zakázanou. Tyto hostingy podporu ImageMagick buďto vůbec nemají nebo je
poskytnuta pomocí třídy Imagick, což je velmi praktické – dá se s obrázky
pracovat objektově.