0 follower

Fragmentcachning

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...
<?php if($this->beginCache($id)) { ?>
...innehÄll som skall cachelagras...
<?php $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().

1. Cache-alternativ ¶

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.

LivslÀngd

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...
<?php if($this->beginCache($id, array('duration'=>3600))) { ?>
...innehÄll som skall cachelagras...
<?php $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.

Beroende

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...
<?php if($this->beginCache($id, array('dependency'=>array(
        'class'=>'system.caching.dependencies.CDbCacheDependency',
        'sql'=>'SELECT MAX(lastModified) FROM Post')))) { ?>
...innehÄll som skall cachelagras...
<?php $this->endCache(); } ?>
...annat HTML-innehÄll...

Variation

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.

Typ av Request

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...
<?php if($this->beginCache($id, array('requestTypes'=>array('GET')))) { ?>
...innehÄll som skall cachelagras...
<?php $this->endCache(); } ?>
...annat HTML-innehÄll...

2. NÀstlad cachning ¶

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...
<?php if($this->beginCache($id1)) { ?>
...yttre innehÄll som skall cachelagras...
    <?php if($this->beginCache($id2)) { ?>
    ...inre innehÄll som skall cachelagras...
    <?php $this->endCache(); } ?>
...yttre innehÄll som skall cachelagras...
<?php $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.