Allowed memory size exhausted in ComponentContainer

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

Nějakou dobu jsme jeli bez nejmenšího problému na PHP 5.2 s Nette verzí 0.9.x a po přesunu na server s PHP 5.3 se nám u některých stránek objevuje:

Fatal error: Allowed memory size of 41943040 bytes exhausted (tried to allocate 261900 bytes) in /var/www/clients/client3/web3/web/libs/Nette/ComponentContainer.php on line 94

(nebo taky lajna 191)

Navýšení paměti jsme už zkoušeli, navíc se nejedná o nijak náročné stránky, spíše naopak – stránka, kde se generuje PDF přes mPDF (u které jsme museli původně na 5.2 navýšit paměť), jede nyní bez problémů.

Zajímavé také je, že se to vždy objeví u ComponentContainer.

Díky za rady.

Fandik
Člen | 19
+
0
-

Při použití verze pro PHP 5.3 jsem měl stejný problém na hostingu, ale na localhostu mi to běželo v pořádku. Přešel jsem kvůli tomu na verzi pro PHP 5.2.

redhead
Člen | 1313
+
0
-

Hmm, pro nás by bylo podstatně jednoduší najít ten problém. Zpátky na 5.2 se nám moc nechce.

Nikdy jiný se s tím nesetkal? Ani nevíte v čem by mohl být zádrhel?

Díky.

Ot@s
Backer | 476
+
0
-

redhead napsal(a):

Nikdy jiný se s tím nesetkal? Ani nevíte v čem by mohl být zádrhel?

Kolik rezervovane pameti (memory limit) ukazuje phpinfo na produkci a lokale? Zkusil bych na produkčním serveru udělat jednoduchý skript, který by alokoval skoro maximální hodnotu povolené ram a cvičně reloadoval. Pokud by občas vyskakovaly tytéž fataly, tak je možné, že se jedná o nekvalitní hosting, co hostuje na webserveru s 2GB ram (nebo hostuje přemíru projektů).

arron
Člen | 464
+
0
-

Prijde mi na tom zvlastni, kolik pameti se snazi alokovat. Tyhle chyby vzdycky padaji, kdyz se snazim alokovat vic nez je limit, ale zpravidla se snazi alokovat pár bytů, které jsou potřeba k uložení nějakého dílčího výsledku (či čehosi). Tady se snaží alokovat poměrně velkou část paměti najednou, což je divné…zkus se zamyslet, co přesně se v té aplikaci může snažit alokovat takové množství paměti najednou.

redhead
Člen | 1313
+
0
-

Právě, že mě nic nenapadá. Nejde o kdovíjak náročné stránky a na předešlém PHP 5.2 to šlo v pořádku. Paměť jsme tam museli navýšit jen kvůli mPDF, který si skutečně bere dost, jinak jsou to prakticky výpisy s db, které jsou samozřejmě stránkované (a na localhostu i na 5.2 to šlo i s od dost menším limitem paměti, než je nastaven teď).

Fandik
Člen | 19
+
0
-

@Ot@s:
Na localhostu mám 128MB a na hostingu je 48MB. Zkusil jsem tento skript:

echo memory_get_usage() / (1024*1024) . ' MB<br>';
$a = str_repeat('abcdefghij',4.9e6);
echo memory_get_usage() / (1024*1024) . ' MB<br>';
$a = NULL;
echo memory_get_usage() / (1024*1024) . ' MB<br>';

a výsledky?
hosting to v pohodě zvládá i po několikerým obnovení stránky. Jinak tady ještě konkrétní čísla:

localhost
0.31745147705078 MB
47.047584533691 MB
0.31752777099609 MB
hosting
0.60427093505859 MB
47.33447265625 MB
0.60440826416016 MB
David Grudl
Nette Core | 8228
+
0
-

Je na serveru povolený garbage collector? Je na to nějaká direktiva.

Vyki
Člen | 388
+
0
-

Řešil jsem podobný problém před měsícem. Chybová hláška Fatal error: Allowed memory... byla stejná a bylo to kvůli robotLoaderu. Ve složce libs, kterou indexuji jsem totiž vedle Nette a NotORM měl i soubory s knihovnou HTMLPurifier, která nepatří k nejmenším. Když jsem indexování této složky pomocí direktivy v souboru netterobots.txt zakázal a zařídil načítání ručně, začalo vše fungovat. Pokud si vzpomínám mPDF také není zrovna nejmenší balík.

Editoval Vyki (13. 10. 2011 17:46)

redhead
Člen | 1313
+
0
-

Vyki, a dělalo ti to u všech stránek? Mě se totiž některé zobrazí v pohodě.

Vyki
Člen | 388
+
0
-

Dělalo mi to pouze na produkčním stroji. Vůběc se nepodařilo vystavět cache robotLoaderu.

Fandik
Člen | 19
+
0
-

@ David Grudl: garbage collector na serveru povolený je (zend.enable_gc = On)

mně to dělá i samostný sandbox (verze pro PHP 5.3), ale jenom na produkčním serveru

David Grudl
Nette Core | 8228
+
0
-

RobotLoader používá funkci token_get_all, která si umí ukousnout pěkný kus paměti. Třeba pro soubor nette.min.php chce 55 MB! Řeší se to tak, že se na první řádek souboru přidá:

<?php //netteloader=trida,trida

se seznamem tříd definovaných v souboru a on je použije místo analýzy. Druhá možnost by byla nahradit tokenizer za méně spolehlivé hledání tříd podle nějakého regulárního výrazu.