Nastavení Debug::$maxDepth způsobí zamrznutí Apache
- BigCharlie
- Člen | 283
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)
- BigCharlie
- Člen | 283
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
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
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
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.