Nette 0.9.2-dev a memory limit

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

Na serveru mám php 5.2.6–1+lenny3 s memory limitem 32M. Při spuštění mi to hlásí
Allowed memory size of 33554432 bytes exhausted (tried to allocate 14939363 bytes). Používám minified verzi a chybu mi to hlásí na

	scanScript($file){if(!defined('T_NAMESPACE')){define('T_NAMESPACE',-1);

je možné nějak snížit paměťové nároky při scanování souborů?

kravčo
Člen | 721
+
0
-

Pamäťové nároky znížiť nejdú – pamäť vyžiera PHP Tokenizer (rozšírenie), ktorého funkciu token_get_all() používa RobotLoader pri autoloadingu. Vyčerpanie pamäte spôsobujú veľké súbory – na ich analýzu je potrebná veľká pamäť. Riešiť sa to dá viacerými spôsobmi…

  1. Veľké súbory rozdelíme na menšie logické celky (ak je to možné).
  2. Najprv RobotLoaderu zakážeme tieto súbory skenovať – vytvoríme súbor netterobots.txt podľa vzoru z distribúcie dibi, či Texy. Následne pre ne vymyslíme iný systém načítania (napr. načítame ich zakaždým, alebo im napíšeme vlastný autoloader).
Panda
Člen | 569
+
0
-

kravčo napsal(a):

Pamäťové nároky znížiť nejdú – pamäť vyžiera PHP Tokenizer (rozšírenie), ktorého funkciu token_get_all() používa RobotLoader pri autoloadingu. Vyčerpanie pamäte spôsobujú veľké súbory – na ich analýzu je potrebná veľká pamäť. Riešiť sa to dá viacerými spôsobmi…

  1. Veľké súbory rozdelíme na menšie logické celky (ak je to možné).
  2. Najprv RobotLoaderu zakážeme tieto súbory skenovať – vytvoríme súbor netterobots.txt podľa vzoru z distribúcie dibi, či Texy. Následne pre ne vymyslíme iný systém načítania (napr. načítame ich zakaždým, alebo im napíšeme vlastný autoloader).

3. Na začátek velkého souboru umístíme řádek, který bude obsahovat seznam všech tříd, které se v souboru nacházejí:

<?php //netteloader=class1,class2,class3
deric
Člen | 93
+
0
-

A je možné takto přednačíst i celé Nette? Používám kompaktní verzi Nette i dibi. Většinou nemám více tříd v jednom souboru, spíše je těch souborů moc. Máte nějakou „best practice“ na délku a počty souborů? Od jakého rozsahu používat vlastní autoloader?

kravčo
Člen | 721
+
0
-

Minified verziu Nette či dibi „prednačítaš“ zrejme sám:

require LIBS_DIR . '/Nette/loader.php';
require LIBS_DIR . '/dibi/dibi.php';

Po týchto dvoch riadkoch (za predpokladu, že sú tam minified verzie) je celé Nette i dibi načítané. Pri veľkom množstve malých súborov nemá prečo Tokenizer vyčerpať pamäť, pracuje totiž vždy len s jedným…

Možno by pomohlo zistenie, na ktorom súbore to zhavaruje…

_Martin_
Generous Backer | 679
+
0
-

kravčo napsal(a):

Možno by pomohlo zistenie, na ktorom súbore to zhavaruje…

Nepoužíváš tam něco ze Zend Frameworku? Mě takto mnohokrát havaroval RobotLoader na třídě pro práci s datem.

deric
Člen | 93
+
0
-

Ze Zendu používám jenom Zend_Mail a složku Zendu jsem RobotLoaderu zakázal procházet. Havaruje to paradoxně na načítání malé třídy (cca 60 řádků).

Uncaught exception 'LogicException' with message
'Class location could not be loaded'
in /home/euser/app/rev87/system/libs/Nette/loader.php:4133
Stack trace:
#0 [internal function]: spl_autoload('location')
#1 /home/euser/app/rev87/system/libs/Nette/loader.php(4133):
	spl_autoload_call('location')
#2 /home/euser/app/rev87/system/libs/Nette/loader.php(4150):
	RobotLoader->addClass('Location', '/home/euser/...')
#3 /home/euser/app/rev87/system/libs/Nette/loader.php(4137):
	RobotLoader->scanScript('/home/euser/...')

nevypadá to na chybu Nette…
bude to nejspíš souviset s tímto bugem: http://bugs.typo3.org/view.php?…

kravčo
Člen | 721
+
0
-

No… nemôže to naraz vyčerpať pamäť i skončiť výnimkou predsa…

Ak na riešenie neprídeš sám, skús opísať, ktorá situácia nastane za akých podmienok…

deric
Člen | 93
+
0
-

Problém s pamětí se objevil jsem použil nekompaktní verzi Nette 0.9.2-dev. Teďka mi na tom serveru běží stabilní nekompaktní verze Nette (asi 0.9), loader používá určitě fci spl_autoload a nejsou s tím problémy. Ta další chyba se projevila u kompaktní verze nette-0.9.1-PHP-5.2