invalidace cache RobotLoaderu pri změně modulu

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

Ahoj,

jak už nadpis napovídá, tak se mě při změně modulu (tj. po kliknutí na link vedoucí do presenteru v jiném modulu) znovu generuje cache RobotLoaderu což má z následek značné zpomalení celé aplikace. Pokud se pak pohybuji v rámci daného modulu tak je vše OK a jakmile se vrátím do původního modulu tak opět znovu generování cache…

Popravdě vůbec netuším kam šáhnout nebo kde hledat chybu, systém modulů jsem víceméně převzal z examples, takže vám sem můžu hodit tak akorát router

<?php
$router = Environment::getApplication()->getRouter();

$router[] = new Route('index.php', array(
	'module' => 'Main',
	'presenter' => 'Areas',
), Route::ONE_WAY);

$router[] = new Route('<module>/<presenter>/<view>');
?>
romansklenar
Člen | 655
+
0
-

Možná ti v tom modulu chybí třída, tak se ji RobotLoader snaži dohledat tím, že se přegeneruje. Zkus si toto chování nějak ovlivnit.

$loader->autoRebuild = Environment::isProduction() ? TRUE : FALSE; // pokud nenajdu třídu, mám se znovusestavit?
crempa
Člen | 198
+
0
-

No tak tahle magie me nikdy neprestane udivovat, jeden radek a vse jede jak ma :-) Diky moc

Nechci se s tim ale tak jednoduse smirit, protoze me neni vubec jasny kde a jak je problem. Aplikace ocividne funguje i kdyz nedojde k regeneraci cache a ta se tudiz dela zbytecne… Co se tedy nastavuje tim magickym $loader->autoRebuild ?

Jinak muj problem je nejspis v tom ze v presenterech vynechavam require_once dirname(__FILE__) . '/BasePresenter.php'; protoze jsem mel za to, ze nic takoveho diky autoloaderu nepotrebuju. Dokonce i v quick startu je dle me tento radek zbytecny.

U tech modulu se ma vec tak ze chci mit jeden BasePresenter spolecny pro vsechny presentery bez zavislosti na modulu, soupnul jsem ho tedy prozatim do rootu modulu a v zadnem z presenteru nemam nic jako require_once dirname(__FILE__) . '/../../BasePresenter.php';… takze jestli toto zapricinuje ten autorebuild.. ?

Editoval crempa (21. 3. 2009 19:31)

paranoiq
Člen | 392
+
0
-

jen nápad: pokud to nikde neháže chybu, tak máš možná někde v šabloně špatný link. při generování linků mezi se používá třída presenteru a pokud ji to nenajde tak nette vypíše „error..“ do adresy linku, ale chybu neohlásí.. a případně spustí ten rebuild cache loaderu

já vadné linky hledám pomocí css takhle:

a[href^="error"] {text-decoration: line-through;}

Editoval paranoiq (21. 3. 2009 20:54)

romansklenar
Člen | 655
+
0
-

crempa napsal(a):

Co se tedy nastavuje tim magickym $loader->autoRebuild ?

Přesně to co je jako komentář v tom příspěvku co jsem psal: „pokud nenajdu třídu, mám se znovusestavit?“ a rozhodne se právě podle hodnoty v autoRebuild (TRUE|FALSE).

paranoiq napsal(a):

já vadné linky hledám pomocí css takhle:

a[href^="error"] {text-decoration: line-through;}

Pokud chybu v odkazech nevidíš ani přes to, zkus si při špatném linku vyhazovat výjimky.

// do bootstrapu:
Presenter::$invalidLinkMode = Presenter::INVALID_LINK_EXCEPTION;
crempa
Člen | 198
+
0
-

Nenajdu tridu kde? jak? kdy? Jednoduse me unika smysl autoRebuildu kdyz bezi aplikace s nim i bez nej…

romansklenar
Člen | 655
+
0
-

Když nenajde třídu v kešce, většinou soubor cache-Nette.RobotLoader%00data v app/temp. Zobraz si ten soubor a pochopíš ;)

phx
Člen | 651
+
0
-

Pokdu se nepletu tak RoborLoader se pokusi max 1× nacist znovu cache (pro pripad kdyz se zmeni umisteni tridy a nesmaze se cahce) a pokud ji nenajde tak smula. Pokud ano tak jede vse dal.

arron
Člen | 464
+
0
-

crempa napsal(a):

Nenajdu tridu kde? jak? kdy? Jednoduse me unika smysl autoRebuildu kdyz bezi aplikace s nim i bez nej…

Co ja vim, tak je to tak, ze pokud se nekde v aplikaci odkazes na tridu, kterou RobotLoader nemuze najit, tak, pokud je nastavena ta promena $loader->autoRebuild, se RobotLoader automaticky přegeneruje. Mam pocit, ze v produkcnim prostredi je toto pak vypnute, aby to v pripade nejake chyby presne takhle nezdrzovalo.

Nicmene to chovani, ktere si popsal naznacuje, ze nekde v aplikaci mas nejakou chybu (mozna i jenom nejaky blby preklep), ktery prave zapricinuje to, ze RobotLoader hleda nejakou tridu ktera neexistuje a proto se pregeneruje. Vyse jsou rady jak odhalit chybu, pokud je nekde v odkazu:-) Pokud je nekde jinde, tak bude treba asi trochu testovani:-)