invalidace cache RobotLoaderu pri změně modulu
- crempa
- Člen | 198
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
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
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
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
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;
- romansklenar
- Člen | 655
Když nenajde třídu v kešce, většinou soubor
cache-Nette.RobotLoader%00data
v app/temp
. Zobraz si
ten soubor a pochopíš ;)
- arron
- Člen | 464
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:-)