0 follower

Datacachning

Datacachning handlar om att lagra nÄgon PHP-variabel i cacheminne och hÀmta tillbaka den senare frÄn cache. För detta ÀndamÄl tillhandahÄller cachekomponentens basklass CCache tvÄ metoder som anvÀnds för det mesta: set() och get().

För att lagra en variabel $value i cacheminnet vÀljer vi ett unikt ID och anropar set():

Yii::app()->cache->set($id, $value);

Cachelagrade data förblir i cachen obegrÀnsat lÀnge om de inte tas bort pÄ grund av nÄgon cachningspolicy (t.ex. slut pÄ cacheutrymme medförande att det Àldsta datat tas bort). För Àndring av detta beteende, kan en förfallotidsparameter lÀmnas med i anropet till set() sÄ att data stÀdas bort frÄn cachen efter en viss tid:

// keep the value in cache for at most 30 seconds
Yii::app()->cache->set($id, $value, 30);

Senare, nÀr variabeln behöver kommas Ät (antingen i samma eller nÄgon annan webbrequest), ÄterhÀmtas den frÄn cache genom anrop till get() med ID bifogat. Om vÀrdet som returneras Àr false, innebÀr detta att sökt vÀrde inte Àr tillgÀngligt i cachen utan mÄste genereras pÄ nytt.

$value=Yii::app()->cache->get($id);
if($value===false)
{
    // regenerate $value because it is not found in cache
    // and save it in cache for later use:
    // Yii::app()->cache->set($id,$value);
}

Vid val av ID för en variabel som skall cachas, tillse att ID:t Àr unikt bland alla andra variabler som kan komma att cachas i applikationen. Det Àr INTE ett krav att ID:t Àr unikt över fler applikationer dÄ cachekomponenten Àr intelligent nog att Ätskilja ID:n tillhörande skilda applikationer.

Vissa cachelagringar, sÄ som MemCache, APC, stöder ÄterhÀmtning av multipla cachelagrade vÀrden genom ett satsvis arbetssÀtt, vilket kan reducera onödig resursanvÀndning vid ÄterhÀmtning av cachelagrad data. Med start fr o m version 1.0.8, tillhandahÄlls en ny metod, mget(), för att dra nytta av finessen. I hÀndelse av att den underliggande cachelagringen inte stöder nÀmnda finess, simuleras den av mget().

För att ta bort ett cachat vÀrde, anropa delete(); för att ta bort allting frÄn cache, anropa flush(). Var mycket försiktig med att anropa flush() eftersom Àven cachelagrat data frÄn andra applikationer tas bort.

Tips: Eftersom CCache implementerar ArrayAccess, kan en cachekomponent anvÀndas som en array. HÀr följer nÄgra exempel:

$cache=Yii::app()->cache; 
$cache['var1']=$value1;  // equivalent to: $cache->set('var1',$value1); 
$value2=$cache['var2'];  // equivalent to: $value2=$cache->get('var2');

1. Cacheberoende ¶

Förutom utgÄngen förfallotid, kan cachelagrat data ocksÄ ogiltiggöras som följd av nÄgon förÀndring i beroenden. Till exempel, om innehÄllet i nÄgon fil cachelagras och filen Àndras, sÄ skall kopian i cachen markeras som ogiltig och det senaste innehÄllet frÄn filen lÀsas i stÀllet.

Ett beroende representeras som en instans av CCacheDependency eller nedÀrvd klass. Dependency-instansen bifogas data som skall cachas i anropet till set().

// the value will expire in 30 seconds
// it may also be invalidated earlier if the dependent file is changed
Yii::app()->cache->set($id, $value, 30, new CFileCacheDependency('FileName'));

Om vi nu ÄterhÀmtar $value frÄn cachen medelst anrop till get(), kommer beroendet att utvÀrderas. Om en förÀndring skett erhÄlls returvÀrdet false, vilket indikerar att data behöver genereras pÄ nytt.

Nedan följer en sammanstÀllning av tillgÀngliga cacheberoenden:

  • CFileCacheDependency: beroendet Ă€ndras vid förĂ€ndring av filens tidangivelse avseende senaste Ă€ndring.

  • CDirectoryCacheDependency: beroendet Ă€ndras vid förĂ€ndring av nĂ„gon fil i katalogen eller dess underkataloger.

  • CDbCacheDependency: beroendet Ă€ndras vid förĂ€ndring i resultatet av databasfrĂ„gan given av specificerad SQL-sats.

  • CGlobalStateCacheDependency: beroendet Ă€ndras vid förĂ€ndring av vĂ€rdet för det specificerade globala tillstĂ„ndet. Ett globalt tillstĂ„nd Ă€r en variabel som behĂ„ller sitt vĂ€rde över multipla request och multipla sessioner i en applikation. Det definieras via CApplication::setGlobalState().

  • CChainedCacheDependency: beroendet Ă€ndras om nĂ„got av beroendena i kedjan förĂ€ndras.

  • CExpressionDependency: beroendet Ă€ndras om vĂ€rdet av det specificerade PHP-uttrycket Ă€ndras. Denna klass har varit tillgĂ€nglig fr o m version 1.0.4.