Med fragmentcachning menas cachning av fragment av en sida. Till exempel, om en sida presenterar en sammanstÀllning av Ärlig försÀljning i form av en tabell, kan tabellen lagras i cacheminne, vilket sparar in tiden som skulle gÄtt Ät till att generera den vid varje request.
För att anvÀnda fragmentcachning, anropa CController::beginCache() och CController::endCache() i en kontrollers vyskript. Dessa tvÄ metoder markerar början respektive slutet av det sidinnehÄll som skall cachelagras. Liksom vid datacachning, behövs ett ID för att identifiera det cachade fragmentet.
...annat HTML-innehÄll... if($this->beginCache($id)) { ...innehÄll som skall cachelagras... $this->endCache(); } ...annat HTML-innehÄll...
Om beginCache() ovan returnerar false, kommer
det cachelagrade fragmentet att automatisk sÀttas in pÄ plats; i annat fall
kommer innehÄll som omsluts av if-satsen att exekveras och cachelagras vid
anrop till endCache().
Vid anrop till beginCache(), kan en array innehÄllande cache-alternativ för anpassning av fragmentcachningen lÀmnas som andra parameter. Faktum Àr att metoderna beginCache() och endCache() bildar en ÀndamÄlsenlig wrapper kring widget:en COutputCache. Av denna anledning kan cachningsalternativen utgöra initialvÀrden för varje property hos COutputCache.
Det kanske vanligaste alternativet Àr duration, som specificerar hur lÀnge cachelagrat innehÄll kan förbli giltigt. Det Àr nÀrbeslÀktat med expiration-parametern hos CCache::set(). Följande kod cachelagrar innehÄllsfragmentet i upp till en timme:
...annat HTML-innehÄll... if($this->beginCache($id, array('duration'=>3600))) { ...innehÄll som skall cachelagras... $this->endCache(); } ...annat HTML-innehÄll...
Om duration inte anges, antar den standardvÀrdet 60, vilket innebÀr att det cachelagrade innehÄllet blir ogiltigt efter 60 sekunder.
Liksom vid datacachning kan innehÄllsfragment som cachelagras Àven ha beroenden. Till exempel, innehÄllet i en för tillfÀllet visad postning beror av om postningen modifierats eller inte.
För att specificera en dependency, sÀtt dependency-
alternativet, vars vÀrde antingen kan vara ett objekt som implementerar
ICacheDependency eller en array innehÄllande konfigurationsvÀrden som kan
anvÀndas för att generera dependency-objektet. Följande kod specificerar att
innehÄllsfragmentet beror pÄ om vÀrdet för kolumnen lastModified Àndrats:
...annat HTML-innehÄll... if($this->beginCache($id, array('dependency'=>array( 'class'=>'system.caching.dependencies.CDbCacheDependency', 'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ...innehÄll som skall cachelagras... $this->endCache(); } ...annat HTML-innehÄll...
InnehÄll som cachelagras kan varieras i enlighet med olika parametrar. Till exempel, den personliga profilen kan se annorlunda ut för olika anvÀndare. Vid cachelagring av profilinnehÄllet vill vi att den cachelagrade kopian varieras baserat pÄ anvÀndaridentiteter. Detta innebÀr huvudsakligen att skilda ID:n skall anvÀndas vid anrop till beginCache().
Som alternativ till att utvecklare varierar ID:n enligt nÄgot schema, har COutputCache en sÄdan finess inbyggd. Nedan följer en sammanstÀllning.
varyByRoute: genom att sÀtta detta alternativ till true, kommer det cachelagrade innehÄllet att varieras enligt route. Det innebÀr att varje kombination av begÀrd kontroller och ÄtgÀrd kommer att fÄ separat cachelagrat innehÄll.
varyBySession: genom att sÀtta detta alternativ till true, kan det cachelagrade innehÄllet varieras efter sessions-ID. Det innebÀr att respektive anvÀndarsession kan fÄ olika innehÄll presenterat, i samtliga fall levererat frÄn cache.
varyByParam: genom att sÀtta detta alternativ till en array med namn, kan det cachelagrade innehÄllet varieras efter vÀrden i de specificerade GET-parametrarna. Till exempel, om en sida presenterar innehÄllet frÄn en postning baserat pÄ GET-parametern id, kan innehÄllet i varje postning cachelagras genom att varyByParam sÀtts till en array('id'). Utan en sÄdan variation skulle bara en enda postning kunna lagras.
varyByExpression: genom att sÀtta detta alternativ till ett PHP-uttryck kan det cachelagrade innehÄllet fÄs att variera i enlighet med vÀrdet av detta PHP-uttryck. Detta alternativ har varit tillgÀngligt fr o m version 1.0.4.
Ibland Àr det önskvÀrt att aktivera fragmentcachning för endast vissa typer av request. Till exempel, för en sida som presenterar ett formulÀr, vill vi endast cachelagra formulÀret nÀr det initialt efterfrÄgas (via en GET-request). All följande presentation av formulÀret (via en POST-request), bör inte cachelagras eftersom formulÀret kan innehÄlla anvÀndarinmatning. Detta kan Ästadkommas genom att specificera alternativet requestTypes:
...annat HTML-innehÄll... if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ...innehÄll som skall cachelagras... $this->endCache(); } ...annat HTML-innehÄll...
Fragmentcachning kan vara nÀstlad. Det innebÀr att ett cachelagrat fragment omsluts av ett större fragment, Àven det cachelagrat. Till exempel, kommentarerna (till postningen) cachelagras i ett inre fragment, vilket cachelagras tillsammans med sjÀlva postningen i en yttre fragmentcache.
...annat HTML-innehÄll... if($this->beginCache($id1)) { ...yttre innehÄll som skall cachelagras... if($this->beginCache($id2)) { ...inre innehÄll som skall cachelagras... $this->endCache(); } ...yttre innehÄll som skall cachelagras... $this->endCache(); } ...annat HTML-innehÄll...
Andra cachningsalternativ kan sÀttas för nÀstlade cachefragment. till exempel, kan den inre och den yttre cachen i ovanstÄende exempel ges olika duration-vÀrden. NÀr innehÄllet i den yttre cachen blir ogiltigt, kan den inre cachen fortfarande tillhandahÄlla giltiga inre fragment. Detta Àr dock inte sant i omvÀnd ordning. Om den yttre cachen innehÄller giltig data kommer alltid den cachelagrade kopian att tillhandahÄllas, Àven om innehÄllet i den inre cachen redan blivit för gammalt och klassat ogiltigt.
Signup or Login in order to comment.