| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
20.09.2007 10:47 mehrere Cashes parallel erzeugen |
|
|
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
20.09.2007 12:08 |
|
|
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 |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
20.09.2007 12:29 |
|
|
@Berdir: schnell und kompetent wie immer... Du solltest mal einen Orden kriegen!
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
20.09.2007 16:13 |
|
|
Zu b) wollte ich eigentlich noch mehr schreiben, hatte dann aber keine Zeit mehr
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!  |
|
| Nach oben |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
20.09.2007 16:28 |
|
|
Danke, werd' ich morgen früh gleich testen...
lg, _________________ ~peggylon~ |
|
| Nach oben |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
21.09.2007 12:08 |
|
|
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 |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
21.09.2007 20:18 |
|
|
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 |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
24.09.2007 8:14 |
|
|
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...
Meintest Du so etwas mit typengenauer Abfrage?
lg _________________ ~peggylon~ |
|
| Nach oben |
|
 |
Berdir Power User
Anmeldungsdatum: 22.09.2005 Beiträge: 1347
|
24.09.2007 8:21 |
|
|
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 f (false === $left = $pear_cache->get('schalter_' . $topic_id,'struktur')) {
$check[] = $topic_id;
echo "Hallo";
} |
|
|
| Nach oben |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
24.09.2007 9:19 |
|
|
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. _________________ ~peggylon~ |
|
| Nach oben |
|
 |
peggylon User
Anmeldungsdatum: 25.09.2006 Beiträge: 67 Wohnort: Berlin
|
24.09.2007 10:21 Lösung gefunden |
|
|
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 |
|
 |
|
|