Metoda __destruct pro třídu Image
- bene
- Člen | 82
Ahoj,
- 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())
.
- 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
- bene
- Člen | 82
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
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.