phpbar.de logo

Mailinglisten-Archive

[php] phplib und Session_id

[php] phplib und Session_id

Johann-Peter Hartmann Hartmann_(at)_freecharts.de
Mon, 17 Jul 2000 13:18:23 +0200


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