PEAR-Forum.de Übersicht Thema anzeigen - mehrere Cashes parallel erzeugen

mehrere Cashes parallel erzeugen


 

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 10:47    mehrere Cashes parallel erzeugen Antworten mit Zitat

Hallo,

ich habe folgende Kostellation. Eine Webapplikation besteht aus zwei Hälften (links Kategorie; rechts Reiterinhalt), welche nun je nach gewähltem Menüpunkt miteinander kombiniert werden. Die linke Seite hat wird durch $topic_id und die rechte durch $sub_topic_id identifiziert.
Nun möchte ich statische Inhalte (in diesem Falle Schaltflächen), für beide Bereiche getrennt cachen.

Warum möchte ich kurz erläutern:
Angenommen der User wählt Kategorie 4 und den Reiter 1, anschließend, Reiter2,3,und nochmal Reiter 1 und abschließend Kategorie 5.
Dann sollen die Schaltflächen für die kategorie beim ersten Besuch der Seite gecached und bei jedem Reiterwechsel statt aus der DB, aus dem cache gelesen werden. Selbes gilt für die Schaltflächen auf der Reiterinhaltsseite. Wird Reiter 1 nochmalig aufgerufen, sollen die zugehörigen Schaltflächen aus dem Cache geladen werden...

Nun habe ich folgenden Ansatz probiert:

PHP:
<?php
$check
=array();
if (!
$left $pear_cache->get('schalter_' $topic_id)) {
    
$check[] = $topic_id;
}
if(!
$right $pear_cache->get('schalter_' $sub_topic_id)) {
    
$check[] = $sub_topic_id;
}

if(
count($check) != 0) {
/* lies Schalterdaten aus der Datenbank für linke ($left), rechte($right) od. beide Seiten */
$pear_cache->save($left);
$pear_cache->save($right);
}
?>


Mit nur einem $pear_cache->get() und $pear_cache->save() funktioniert es. Mit beiden, wird jeweils nur der Cache für $right erzeugt.

Ist ein parallel-speichern möglich? Müsste ich ein anderes Cache_Lite-Objekt verwenden?

lg,

_________________
~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 12:08     Antworten mit Zitat

Das gleiche Problem hatte ich auch schon, genau gesagt sind es nicht parellele Speichervorgänge, sondern verschachtelte. Es gibt jetzt 2 Lösungsansätze:

a) Du trennst es auf, sollte in deinem Fall kein Problem sein, geht aber nicht immer, wenn es dann *wirklich* verschachtelt ist. Einfach immer folgende Reihenfolge einhalten get -> save -> get -> save...

PHP:
<?php
$check
=array();
if (!
$left $pear_cache->get('schalter_' $topic_id)) {
    
$check[] = $topic_id;
}

if(
$topic_id) {
/* lies Schalterdaten aus der Datenbank für linke ($left) */
$pear_cache->save($left);
}

if(!
$right $pear_cache->get('schalter_' $sub_topic_id)) {
    
$check[] = $sub_topic_id;
}

if(
$sub_topic_id) {
/* lies Schalterdaten aus der Datenbank für rechte($right) */
$pear_cache->save($right);
}


b) Einfach bei save den Schlüssel-Namen mit angeben, intern wird immer der letzte get-Aufruf gespeichert, der natürlich überschrieben werden kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag20.09.2007 12:29     Antworten mit Zitat

@Berdir: schnell und kompetent wie immer... Du solltest mal einen Orden kriegen! Razz

Ansatz a wollte ich vermeiden, um doppeltes Abfragen der Datenbank zu vermeiden.
Ansatz b hab' ich leider nicht ganz verstanden. Wie meintest Du das mit den Schlüsselwerten bei ->save() ?

Gruß

_________________
~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 16:13     Antworten mit Zitat

Zu b) wollte ich eigentlich noch mehr schreiben, hatte dann aber keine Zeit mehr Wink

Beim 2. Parameter von save kann man die ID angeben, die man bei get auch verwendet. Wenn keine angegeben wird, wird intern einfach die genommen vom letzten get-Aufruf.

http://pear.php.net/package/Cache_Lite/docs/1.7.2/apidoc/Cache_Lite/Cache_Lite.html#methodsave

PS: Nen Orden nicht, aber vielleicht krieg ich dafür im November nen Weltmeisterschaftstitel :p

PPS: 1000 Beiträge, ich wil kein Power User mehr sein! Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag20.09.2007 16:28     Antworten mit Zitat

Danke, werd' ich morgen früh gleich testen...

lg,

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


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag21.09.2007 12:08     Antworten mit Zitat

Habe den Vorschlag mit den IDs bei ->save() probiert. Jetzt werden beide Files korrekt erzeugt. Allerdings gibt es noch Probleme beim ->get(). Es wird nur die erste Abfrage korrekt ausgeführt. Die zweite if-Abfrage nach Existenz des Caches der rechten Seite wird falsch ausgewertet.

Also folgender Test gibt "Leute 4, 119" aus...:
PHP:
<?php
if (!$left $pear_cache->get('schalter_' $topic_id,'struktur')) {
    
$check[] = $topic_id;
    echo 
"Hallo";
}
if(!
$right $pear_cache->get('schalter_' $sub_topic_id,'struktur')) {
    
$check[] = $sub_topic_id;
    echo 
" Leute";
}
echo 
" $topic_id, $sub_topic_id";


... obwohl die Cachefiles 'cache_struktur_schalter_4' und 'cache_struktur_schalter_119' vorhanden sind...

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


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag21.09.2007 20:18     Antworten mit Zitat

Komisch, der Cache is wohl kaum zu alt, wenn du es kurz zuvor erstellt hast.

Prüf einmal den genauen Rückgabewert von get.. Wenn der Cache leer ist, kommt das bei deiner Abfrage aufs gleiche raus, wie wenn er nicht existiert (false).

Eine typensichere Prüfung ist in diesem Fall besser, meiner Meinung nach...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag24.09.2007 8:14     Antworten mit Zitat

Hallo Berdir,

danke für diesen Tipp! Dann liegt es daran, dass der Cache für die rechte Seite leer ist.
Kann man das genauer eingrenzen, so nach dem Motto:
Mach DB-Abfrage, wenn Cache nicht existiert aber keine wenn er lediglich leer ist...Question
Meintest Du so etwas mit typengenauer Abfrage?

lg

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


Anmeldungsdatum: 22.09.2005
Beiträge: 1347

Beitrag24.09.2007 8:21     Antworten mit Zitat

get gibt entweder false oder den Inhalt des Caches zurück. Damit nur dann neu ausgelesen wird, wenn es auch wirklich false zurück gibt, musst du das so prüfen:

PHP:
<?php
(false === $left $pear_cache->get('schalter_' $topic_id,'struktur')) {
    
$check[] = $topic_id;
    echo 
"Hallo";
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden PEAR-User
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag24.09.2007 9:19     Antworten mit Zitat

Habe die if-Abfrage entsprechend umgestaltet. Leider geht das Script weiterhin in die Ausgabe "Leute" hinein, da (hab's mit dem Debugger geprüft), 'false' als Ergebnis von $pear_cache->get() übergeben wird...

PHP:
<?php
if(false === $right $pear_cache->get('schalter_' $sub_topic_id,'struktur')) {
    
$check[] = $sub_topic_id;
    echo 
" Leute";
}


Der Inhalt des Cachfiles ist
Zitat:
-136683771b:0;
.
_________________
~peggylon~
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
peggylon
User


Anmeldungsdatum: 25.09.2006
Beiträge: 67
Wohnort: Berlin

Beitrag24.09.2007 10:21    Lösung gefunden Antworten mit Zitat

Hallo,

hab's jetzt so gelöst:

PHP:
<?php
if(!file_exists('pear_cache/cache_struktur_schalter_' $sub_topic_id) && !$right $pear_cache->get('schalter_' $sub_topic_id,'struktur')) {


Jetzt klappen alle Variationen (auch mit leeren Caches).

Danke für die Hilfe!!!

_________________
~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