Mailinglisten-Archive |
Hallo Liste, Heiko, Heiko Schubert schrieb: > Ach ja, auf jeder php-Seite habe ich am Anfang "page_open(array("sess" => > "Example_Session"));" und am Ende "page_close()" eingefügt. Bei Frames http://www.koehntopp.de/php/faq-16.html#ss16.12 anschauen : page_close nur auf PHP-Seiten, die etwas an Session/User/etc-Variablen ändern. > Hat jemand eine Idee, wie ich mein Problem in den Griff bekommen könnte? > Ich würde die Abfrage ja gerne selber in der phplib anpassen, aber ist > anscheinend mein php nicht gut genug, als dass ich diesen Part selbst > anpassen könnte (ich verstehe es einfach nicht, was die da in dem Part - > Datei: ct_sql.inc - der phplib machen). In meiner Ahnungslosigkeit sieht das ein wenig nach einer Race-Condition zwischen Zeile 92 und 92 der ct_sql.inc aus . page_close ruft $sess->freeze auf, das die Session im aktuellen Container (dh. "ct-") zu speichern versucht . Dazu benutzt die methode "ac_store" aus der Container-Klasse . > Meine Überlegung: Bisher habe ich bei mir ein paar Klassen im Einsatz, > die das Schreiben in meine DB übernehmen. Dabei wird auch kontrolliert, > ob ein evtl. Eintrag schon existiert. Wenn ja, dann wird statt des INSERT > ein UPDATE verwendet: Genau das macht die PHPlib in den Zeilen auch : $uquery = sprintf("update %s set val='%s', changed='%s' where sid='%s' and name='%s'", $this->database_table, $str, $now, $id, $name); $iquery = sprintf("insert into %s ( sid, name, val, changed ) values ('%s', '%s', '%s', '%s')", $this->database_table, $id, $name, $str, $now); 92 $this->db->query($uquery); 93 94 if ( $this->db->affected_rows() == 0 95 && !$this->db->query($iquery)) { $ret = false; } return $ret; Sprich: mach ein Update, und wenn das nichts bringt (also kein entsprechender Eintrag vorhanden war), dann mach einen Insert. Wenn jetzt parallel zwei Seiten etwa gleichzeitig an der Zeile 92 ankommen, und versuchen, dieselbe Session zu updaten, dann kann es zu dieser Reihenfolge kommen: Frame 1 Frame2 92:update 92:update 94:leer 94:leer 95: insert 95:insert -> Fehler . Man sollte wenn möglich immer nur einen Frame den page_close() durchführen lassen. ( Konkurrierendes Setzen von Session-Variablen würde auch ein Konfliktmanagement erfordern ) Grüße, - johann
php::bar PHP Wiki - Listenarchive