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