Metoda __destruct pro třídu Image

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

Ahoj,

  1. Důležité, bylo by možné přidat do třídy Image metodu:
public function __destruct()
{
    imagedestroy($this->image);
}

Teď není jiná možnost, než zavolat imagedestroy($image->getImageResource()).

  1. To už není tolik důležité, ale uvítal bych lazyloading pokud načítám ze souboru. Důvod: Řekněme že si z formuláře vytáhnu obrázky. Ty předám do modelu a tam teprve rozhoduji o jejich ukládání. Předávat HttpUploadFile do modelu mi nepříjde jako správné řešení. V případě, ale že předám více obrázků, padne to na paměti.

Dík

David Grudl
Nette Core | 8218
+
0
-

K čemu potřebuješ imagedestroy volat?

bene
Člen | 82
+
0
-

David Grudl napsal(a):

K čemu potřebuješ imagedestroy volat?

Ha tak se omlouvam, moje chyba. ‚unset‘ normálně funguje. Chtěl jsem uvést problém na příkladu, ale jednoduchý příklad je v pořádku.

Mám totiž v kódu předávání obrázku přes dvě třídy a i když jsem zavolal unset nad oběma a image tak mi paměť pořád rostla. Pomohlo právě jen zavolání imagedestroy($image->getImageResource()). Tudíž budu mít v kodu nějakou botu. Používam php 5.2.6, ale cykleni v třídách není!

Každopádně k druhému problému. HttpUploadedFile::getImage() mi vrátí objekt typu Image. Bylo by super mít možnost si nadefinova jakou třídu mi to má vracet, abych si mohl udelat nějaky lazy. Protože pokud vrátím objekt typu Image ihned se mi vytvoří resource. Tudíž když chci předat 10 obrázků nějakému modelu aby se postaral o uložení tak je paměť v háji :-( Jediná možnost je předávat celý HttpUploadedFile nebo si vytvářet vlastní objekt v presenteru a předat do něj cestu a vytvářet image až při ukládání. Možná se na to ale dívám špatně a předání HttpUploadedFile je nejjednodušší cesta i když se mi tolik nelíbí.

Každopádně dík za reakci, která mě donutila udělat si testy. A omlouvám se že jsem je neudělal rovnou.

David Grudl
Nette Core | 8218
+
0
-

PHP 5.2 zvládá hůř uvolňování zdrojů z paměti, takže v určitých případech je mu třeba pomoci. Ať už přes unset($image), nebo oním $image->destroy() (což je asi šikovnější zápis než imagedestroy($image->getImageResource()).

Uvolňovat to automaticky v destruktoru by mohlo mít nechtěné vedlejší efekty, protože nad jedním image resource může fungovat víc objektových obálek.

bene
Člen | 82
+
0
-

Dobrý nápad přidat tříde Image metodu destroy().

David Grudl
Nette Core | 8218
+
0
-

Je tam via magické __call.