| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
20.09.2007 13:16 Methoden cachen |
|
|
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(6, 7, 2, 1);
$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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
20.09.2007 17:22 |
|
|
Puh, das ist nicht einfach
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(6, 7, 2, 1);
// 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 |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
27.09.2007 14:11 |
|
|
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 |
|
 |
|
|
|
Zu Deinen Favoriten hinzufügen
|
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
|
|