CCache von ganzen Seiten

Hallo,

ich bin grad dabei ganze Seiten zu Cachen jedoch ohne Erfolg.

Vielleicht kann mir einer ein Tutorial dazu zeigen. Hier meine Änderungen:

main.php




'cache'	=> array(

	'class' => 'system.caching.CApcCache',

),

Mein controller


public function filters(){

    return array(

        array(

            'COutputCache',

            'duration'=>100,

            'varyByParam'=>array('styp', 'svalue'),

        ),

    );

}

die Ladezeiten der Seiten werden nicht kleiner und ich kann auch nicht sehen wo die gecachten Dateien abgelegt werden?!!? Der Ordner ist ja runtime/cache/HASH().bin.

Kann ich den gecachten Dateien einen anderen Namen geben?

Mein Ziel ist es die Seiten der Methode actionPhrase zu cachen und das mit den Parametern sTyp und sValue.

Wie kann ich herausfinden ob eine Seite gecached wurde?

Ich habe den php-apc installiert. Würdet ihr mir zu was anderem raten?

danke für eure Hilfe

Hab Seitencaching auch noch nicht verwendet und auf die Schnelle keine Zeit mir das näher anzusehen. Was mir aber gleich auffällt: Wieso glaubst du, dass die Cachedatein in runtime/cache/HASH().bin liegen? Du verwendest doch APC, die Cachedaten liegen also im Speicher. Bei APC ist ein kleines Script (meistens apc.php) dabei. Installier das mal irgendwo, dann kannst du wunderbar prüfen, was alles so im APC abgelegt wurde und wie dieser ausgelastet ist.

sorry, das waren wohl die Dateien von CFileCache die noch dadrinnen waren.

Weißt du denn wie ich den gecachten Sachen eigene Namen geben kann.

Mein Fall sieht so aus, das die Dateien locker einen Monat im Cache bleiben können. Ich will das sie nur gelöscht werden, wenn ich an den dynamischen Seiten was ändere. Dafür brauche ich aber den Namen von den DAteien

Die Dateinamen kriegst du gar nicht. COutputCache ist ja ein Filter, der von Controller-/Action-ID abhängen dürfte, nicht von einem Dateinamen.

Schau dir mal Dependencies näher an. Die sind dafür gedacht, bestimmte Sachen aus deinem Cache wieder rauszuschmeissen. Damit solltest du also was entsprechendes basteln können.

Ich bin grad auf http://www.yiiframework.com/doc/guide/1.1/en/caching.fragment, jedoch hilft mir das nicht weiter.

Ich rufe den Cache im Filter auf.

Ich brauche nur die interne ID der gecachten Seiten. Irgendwie muss die sich ja zusammensetzen.

Wenn ich ein Update auf die dynamische Seite machen, dann soll die Seite im Cache gelöscht werden.

Eigentlich ganz einfach.

Mein gewünschter Workflow ist folgender:

  1. Seite wird aufgerufen und gecached auf lebenslang

  2. Wenn UPDATE auf Seite dann alte gecachte Seite löschen und neue Seite erneut cachen.

Ich habe meine Frage auch im englischen Forum gestellt und bin nun folgendermaßen weit gekommen.

Man muss eine zusätzliche Tabelle erstellen und mit CDbCacheDependency arbeiten, was überprüft ob die Cache noch aktuell ist.

Leider weiß ich noch nicht wie genau ist das implementieren kann, da der Page Cache in der filter() Methode aufgerufen wird!

@Mike

das gleiche hast du auch in folgendem Post geschrieben: http://www.yiiframework.com/forum/index.php?/topic/7627-page-caching-with-cfilecache/page__p__38698__hl__CDbCacheDependency#entry38698

Vielleicht kannst du den Gedanken weiterdenken und hier noch paar Tipps geben, wie man das in die filters() Methode einbringen kann.

thx & mfg

Du musst die Logik umkehren: D.h. statt die Seiten aus dem Cache zu löschen, wenn du sie updatest, prüfst du jedesmal, wenn die Seite aus dem Cache geladen werden soll mit Hilfe der Dependency ob die Seite noch gültig ist.

Mein Ansatz wäre:

  1. Seite wird frisch aufgerufen - sie wird neu geladen und im Cache abgelegt

  2. Seite wird erneut aufgerufen - Dependency schaut "irgendwo" nach, ob die gecachte Version ungültig geworden ist. Falls nicht, liefert die Dependency false zurück und löscht die Seiten-Id aus "irgendwo".

  3. Seite wird geändert - jetzt schreibt man nach "irgendwo" die Seiten-Id, und signalisiert, dass diese Seite nicht mehr länger gültig ist, sollte sie gecacht sein

Das "irgendwo" könnte z.B. ein ganz einfaches Array sein, dass du z.B. unter dem Schlüssel "expiredpages" oder so ebenfalls im Cache ablegst.

So müsste das prinzipiell funktionieren. Details muss man natürlich noch erarbeiten. Wiegesagt, hab mir Dependencies so richtig auch noch nicht näher angesehn.

  1. ok

  2. dieses nachschauen habe ich zur Zeit mit


		'dependency' => array(

			'class' => 'CDbCacheDependency',

			'sql' => 'SELECT MAX(lastModified) FROM basicforms',

		),

	),

gelöst. Das Problem ist jedoch, dass diese Lösung um einiges langsamer ist, was ich sehr ärgerlich finde, da ich nun eine zusätzliche DB Abfrage machen muss. Ich suche nach wievor eine Lösung mit der ich gezielt Seiten aus dem Cache löschen kann. Wenn eine Seite gecached wird, dann wird ja ein Schlüssel erzeugt und dieser muss doch irgendwie zuberechnen sein?!

  1. Das Ändern kann man mit der SQL-Depencency-Lösung soweit lösen, das man das Datum weit nach hinten stellt. duration überprüft bei jedem Seitenaufruf (naja-Lösung) ob die gecachte Seite noch aktuell ist.

Eine bessere Lösung wäre, wenn man nach dem Update den Cache aufrufen könnte und die Seite direkt gecached wird. Hier habe ich auch noch keine Lösung gefunden.

Ich bin der festen Überzeugung das das Caching von yii noch nicht ausgereift sind und noch einiges an Methoden fehlen. Selbst das agile Buch über yii behandelt das Caching mehr als stiefmütterlich!

Falls du neue Erkenntnisse findest dann bitte immer her damit ^^

Ist zwar ein alter Thread, aber hier gibts eine Variante, wie man ein rel. einfaches System bauen kann, um Seiten gezielt aus dem Cache zu entfernen, wenn man z.B. einen Artikel updated:

http://www.yiiframework.com/forum/index.php?/topic/21232-cache-questions/page__view__findpost__p__104090

Hi,

ist es für dich eine Option, mit Memcache zu cachen?

Wir nutzen das seit kurzen und sind sehr zufrieden mit der Anwendung und dem Resultat.

Damit lassen sich auch leicht ganze Seiten oder Blöcke von Seiten cachen.

Gruß,

rall0r.