Nastavení Debug::$maxDepth způsobí zamrznutí Apache

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

Ahoj,

narazil jsem na chybu, která nejspíše souvisí s jednou již dříve hlášenou.

Nastavení Debug::$maxDepth v bootstrapu má zásadní vliv na rychlost generování okna laděnky. V nejhorším případě (Debug::$maxDepth = 99) způsobí „zamrznutí“ Apache – celý skript je ukončen díky vyčerpání dostupné paměti, alespoň podle logu:

[26-Aug-2009 11:03:42] PHP Fatal error:  Allowed memory size of 16777216 bytes exhausted (tried to allocate 2532279 bytes) in  xxx\libs\Nette\loader.php on line 697

[26-Aug-2009 11:03:42] PHP Fatal error:  Uncaught exception 'FatalErrorException' with message 'Allowed memory size of 16777216 bytes exhausted (tried to allocate 2532279 bytes)' in xxx\libs\Nette\loader.php:697
Stack trace:
#0 [internal function]: Debug::shutdownHandler()

Zkoušel jsem na lokálu různá nastavení Debug::$maxDepth. Při $maxDepth = 1 je generování bleskurychlé (442ms podle profileru), ale již při nastavení $maxDepth = 10 je v mém případě zpomalení řádově pomalejší (20 351ms).

Od té hlášené chyby se to liší tím, že k vyvolání chyby nedochází v komponentě, ale v metodě modelu. Pokusím se dát dohromady nějaký minimální kód, který to způsobí. Rozhodně pozor na nastavení Debug::$maxDepth na produkčním serveru.

Editoval BigCharlie (26. 8. 2009 12:11)

jasir
Člen | 746
+
0
-

Skoro 6 hodin, tak tomu říkám trpělivost. :-) Kolik měl ten Dump megabajtů?

BigCharlie
Člen | 283
+
0
-

Achjo, samozřejmě chyba. Hlavně že jsem tam hrdě napsal, že jde o sekundy. Ale to malé m tam fakt nebylo!?? (Ale bylo…). Původní post opraven, kaju se.

Takže zpomalení při změně z 1 na 10 není řádové, ale cca padesátinásobné. Zbytek postu opravdu platí.

Ondřej Mirtes
Člen | 1536
+
0
-

Asi to záleží na povaze dumpovaného objektu, dá se čekat, že to při obrovském rekurzivním záznamu bude trvat dlouho.

David Grudl
Nette Core | 8228
+
0
-

Tohle přece není chyba (ani to dřívější hlášení), Debug::$maxDepth existuje právě proto, aby se předešlo vyčerpání paměti nebo dlouhému generování výstupu při dumpování skutečně rozsáhlých struktur. Pokud tento limit vypnu (nebo nastavím na hodnotu odpovídající vypnutí), tak je logické, že dojde k problému, kterému má zamezovat.

BigCharlie
Člen | 283
+
0
-

Ok, dík za objasnění. Tím se tohle vlákno může považovat za uzavřené. A snad pomůže někomu dalšímu.