RSS Feed
^__^

Der Symfony Cache, seine Keys und cache_namespace_callable

Max Girkens, 2010/01/22 16:41

Symfony hat ja einen Cache.

Der cached ggf (zB. mit der Option “with_layout: true”) auch eingebundene Partials. Sagen wir mal in einer Sidebar.
Schön schnipselweise werden die gecached.

Die haben dann auch jeweils einen CacheKey. Den sieht man auch wenn man für das dev environment den cache einschaltet in den kleinen bunten Info Kästen.

Ein Problem hat man aber dann, wenn jetzt ein Partial auf einer Seite je nach Parameter andere Dinge tun soll.
Dann hat man schnell die eine Version aus dem Cache (die zuerst aufgerufene eben) und nicht mehr die mehreren Erscheinungsformen.
Ist ja das gleiche Partial. Also lässt man das Cachen der Partials entweder weg, oder sorgt dafür dass die Dinger je nach Vorkommen einen anderen CacheKey kriegen. Und damit dann auch verschiedene Versionen gecached werden.

Dazu gibt es die Config Variable: “cache_namespace_callable” in der settings.yml.
Da kann man eine Funktion / statische Methode angeben, die einen alternativen CacheKey generiert.

Die kriegt dann eine Instanz vom sfViewCacheManager übergeben, der normalerweise den CacheKey generiert.
nur will man jetzt auf die original Methode zugreifen, und beispielsweise nur etwas anhängen, wird es etwas komplizierter.
Ruft man die aus seiner Custom Callback Funktion auf, ended man im Loop, weil die ->generateCachekey() Methode dann wiederum die callback Funktion aufruft uswusw.

Gehen tut das aber schon, zB mit diesem simplen Trick:


public static function GenerateMyCustomCacheKey( $internalUri, $hostName = '', $vary = '', $contextualPrefix = '', $sfViewCacheManager )
   {

  	//den Wert von sf_cache_namespace_callable speichern
  	$callableFunction =  sfConfig::get( 'sf_cache_namespace_callable' );

  	//sf_cache_namespace_callable auf false setzen
  	sfConfig::set( 'sf_cache_namespace_callable', false );

  	//jetzt die default methode auf unserer Instanz von sfViewCacheManager aufrufen
       //sf_cache_namespace_callable ist ja nun false, also passiert auch kein loop
  	$key = $sfViewCacheManager->generateCachekey( $internalUri, $hostName = '', $vary = '', $contextualPrefix = '' );

  	//sf_cache_namespace_callable wieder herstellen
  	sfConfig::set( 'sf_cache_namespace_callable', $callableFunction );

        //key manipulieren und zurückgeben
  	return $key . $myCustomSuffix;

  }

dann eben nur noch in der settings.yml der entsprechenden APP die callback Funktion angeben und voila – hat man custom cache keys und kann sich zB. x Versionen eines Partials erzeugen lassen.

cache_namespace_callable: GenerateMyCustomCacheKey

oder

cache_namespace_callable: myStaticHelperClass::GenerateMyCustomCacheKey

3 Responses to “Der Symfony Cache, seine Keys und cache_namespace_callable”

  1. Christian says:

    Hi Max,

    Kontext-abhängige Partial Cachekeys kannst du nach meinem Verständnis automatisch von symfony generieren lassen ohne eine eigene Implementierung.
    http://www.symfony-project.org/reference/1_2/en/09-Cache#chapter_09_contextual

    Gruss
    /Christian

  2. Max Girkens says:

    oh.

    ja, in der Tat. Das hab ich komplett übersehen.

    dass ich das Buch hier im Regal stehen hab, macht die Sache irgendwie nicht besser :D

    Danke jedenfalls!

  3. Christian says:

    Jetzt bin ich doch glatt nochmal auf deinen Post gestossen.
    Ich hatte naemlich jetzt wirklich die Anforderung den Cache Key manuell zu setzen. Da hast du sehr geholfen! Danke.

Leave a Reply