PEAR-Forum.de Übersicht Thema anzeigen - Methoden cachen

Methoden cachen


 

PEAR-Forum.de Übersicht » Caching
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag20.09.2007 13:16    Methoden cachen Antworten mit Zitat

Hallo,

die nächste Frage folgt schon auf dem Fuss...

Ich möchte gern mein Hauptmenü (und nach Möglichkeit auch die pro Kategorie unterschiedlichen Reitermenüs) cachen.
Basis ist die Klasse LayersMenu. Die Klasse erzeugt 3 Textblöcke, die via Templateengine (Smarty) an verschiedenen
Stellen der Seite eingetragen werden. Ursprünglich hatte ich den ganzen schmus mal mit smarty gecached, aber das ist nicht praktikabel.
Die Initialisierung sieht in etwa wie folgt aus:
PHP:
<?php
$mid 
= new LayersMenu(6721);
$mid->setTableName('struktur_menue_haupt');
$mid->setTableFields(array(...));
$mid->setTableName_i18n('struktur_menue_translation');
$mid->setTableFields_i18n(array(...));


Dann kommen die Menüinhalte aus der Datenbank (diese(n) Schritt(e) würde ich gern cachen):
PHP:
<?php
//Hauptmenü
$mid->scanTableForMenu('hormenu1'$lang,1,0);
$mid->newHorizontalMenu('hormenu1');
//Reitermenü
if ($kategorie != "" && $menueID != NULL) {
    
$mid->scanTableForMenu('hormenu2'$lang,2,$menueID);
    
$mid->newReiterMenu('hormenu2');


Zum Schluss die Übergabe an Smarty:
PHP:
<?php
$smarty
->assign_by_ref("mid"$mid);
$menue=array($smarty->fetch('menue_header.tpl'),$smarty->fetch('menue_main.tpl'),$smarty->fetch('menue_footer.tpl'));
$smarty->assign('menue',$menue);


In den Templates wird jeweils die Methode zum Anzeigen des Modules aufgerufen z.B. {$mid->printHeader()}
Ich hatte mir die Dokumentation zur Brust genommen und folgendes versucht:
PHP:
<?php
$pear_function_cache
->call('$mid->scanTableForMenu','hormenu2'$lang,2,$menueID);

Ein Cachefile wurde zwar erzeugt, der enthielt aber lediglich die auch im Browser ausgegebene Fehlermeldung:
Zitat:
Warning: call_user_func_array() [function.call-user-func-array]: First argumented is expected to be a valid callback, 'Array' was given in C:\XAMPP\php\pear\Cache\Lite\Function.php on line 142



2. Versuch war:
PHP:
<?php
$pear_function_cache
->call(array(&$mid'scanTableForMenu'), 'hormenu1'$lang,1,0);

Hier kommt zwar keine Fehlermeldung, aber es gibt offensichtlich probleme mit dem Menü.
Zitat:
LayersMenu Error: newHorizontalMenu: the first/last item of the menu 'hormenu1' is not defined; please check if you have parsed its menu data.
Halted.


Was ist hier verkehrt? Gibt es noch einen clevereren Ansatz zum Cachen mehrerer Methoden einer Klasse?


*Ratlos*

_________________
~peggylon~
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Berdir
Power User


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag20.09.2007 17:22     Antworten mit Zitat

Puh, das ist nicht einfach Wink

Cache_Lite_Function funktioniert nicht, weil dort einfach die Aus und Rückgabe einer Funktion/Methode speichert.. das Objekt selbst interessiert ihn nicht. Du kannst also damit nicht ein Objekt in einen bestimmten Zustand versetzen.

Du könntest das ganze Objekt serialisiert cachen, dann kannst du aber nicht verschiedene Methoden-Aufrufe kombinieren, das ist technisch nicht möglich.

Wenn du mit Caching arbeiten willst, musst du versuchen, die Logik um zu bauen, so das du irgendwo Strings/Arrays hast, die sich sinnvoll cachen lassen. Oder es zumindest in mehrere Objekte aufteilen, welche du dann serialisieren kannst.


Beispiel:
PHP:
<?php
// Wie gehabt dein Menü-Objekt erstelen
$mid = new LayersMenu(6721);

// Eine neue Klasse erstellen, welche die Datenstruktur repräsentiert
$data  = new MenuData();
$data->setTableName('struktur_menue_haupt');
$data->setTableFields(array(...));
$data->setTableName_i18n('struktur_menue_translation');
$data->setTableFields_i18n(array(...))
$data->scan('hormenu1'$lang,1,0);

/** Jetzt hat $data vermutlich intern irgendwelche "Daten-Konstrukte" erstellent, 
jetzt kannst du entweder die Klasse, oder diese Daten cachen. Anstelle jetzt dann 
direkt getData() aufzurufen, könntest du z.B. diese Rückgabe in einem Cache speichern 
und das Objekt nur erstellen, wenn es benötigt wird. Oder du übergibst eben das Objekt, 
und speicherst es komplett im Cache (serialisiert) **/

$mid->newHorizontalMenu($data->getData());


Allgemein gilt bei OO, dass die Klassen möglichst atomar sein sollten, also nicht wie in diesem Fall Darstellen + Daten auslesen, sondern nur entweder oder. Das bietet die Vorteile das du die einzelnen Klassen eher wiederverwenden kannst und auch untereinander austauschen solange die Schnittstellen kompatibel sind.

Eine sehr gute Lektüre dazu ist folgendes Buch:
http://www.amazon.de/PHP-Design-Patterns-Deutsche-Ausgabe/dp/3897214423
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag27.09.2007 14:11     Antworten mit Zitat

Ich habe vorerst eine Lösung gefunden, wie ich die Menüs (zumindest teilweise) cachen kann. In der Funktion scanTableForMenu() habe ich einen $pear_cache->get() / ->save() eingebaut, der die Daten aus der Datenbank cached, auf welchen die einzelnen Menüs basieren.

Mit OOP bin ich leider noch nicht so wirklich fit. Vielleicht kann ich später noch nachbessern...
Danke für die Hilfe und den und den Buchtipp! Werd' mir das Buch mal besorgen...

liebe Grüße!

_________________
~peggylon~
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Diese Seite übersetzen
PEAR-Forum.de Übersicht » Caching
Neues Thema eröffnen Neue Antwort erstellen Diesen Beitrag ausdrucken
   Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

Zu Deinen Favoriten hinzufügen

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen