Nette\Image a paměť

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Teyras
Člen | 81
+
0
-

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?

jasir
Člen | 746
+
0
-

No tak on už jako má spoustu paměti alokované, pak chce ještě 15kB, a ty už nedostane.

Teyras
Člen | 81
+
0
-

Jo tak… no, tak aspoň to dává smysl, ale pořád nevim co s tím, malý soubory to zvládne v pohodě

Jan Tvrdík
Nette guru | 2595
+
0
-

Požádat hosting o zvýšení memory limit, pakliže ho nemůžeš zvětšit sám.

h4kuna
Backer | 740
+
0
-

Sam si ho muzes zvetsit tak ze do .htaccess pridas radek

<?php
php_value memory_limit 32M
?>

mej ho v rootu webu a pak pres

<?php
phpinfo();
?>

se mrkni zda se zvedlo, pokud ne: smolik

Editoval matata (27. 8. 2009 14:16)

Teyras
Člen | 81
+
0
-

No, požádal sem hosting, aspoň o kousek mi to zvedli… Navíc když nahrávám obrázky s normálním rozlišením, funguje to jak má.

David Grudl
Nette Core | 8228
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8228
+
0
-

Ano, tu konstantu jsem spočítal špatně, má tam být cca 1e6. Opravím.

RDPanek
Člen | 189
+
0
-

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
+
0
-

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:

https://forum.nette.org/…-imagemagick

Vyki
Člen | 388
+
0
-

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ě.

pjoter
Člen | 118
+
0
-

Narazil jsem také na omezení paměti, při obsluze webservice pomocí nusoap. Použil jsem Nette\Image na resize ale při překročení přiřazené paměti celý skript padal. Možná že mi něco uchází ale proč to omezení paměti třida netestuje a nevrací exception?