Großer SESSION Bug in Verbindung mit Objekten!?

michanismus

Aktives Mitglied
Thread Starter
Dabei seit
23.08.2004
Beiträge
434
Reaktionspunkte
0
Hallo,

wie schon der Titel sagt bin ich auf ein größeres Problem gestoßen.

Die Vorgeschichte: Ich möchte bei meinem derzeitigen Projekt mittels
mod_rewrite von Apache ein PHP Skript vor jedem anderen ausführen
lassen. Aus welchem Grund? Ich möchte einfach das generell die Session
gestartet wird und grundlegende Konstanten und Objekte laden lassen.

Da liegt das Problem, eben bei den Objekten.

hier erstmal die Quelltexte (alles einfach gehalten):

.htaccess
Code:
RewriteEngine On
RewriteRule ^(.*)(\.php|\.php4|\.php5|\.php3)$ /Volumes/Daten/Work/XXX/lib/config/rewrite.php

rewrite.php
PHP:
ini_set('session.bug_compat_warn', 0);
session_start();

define( 'SERVER_ROOT', '/Volumes/Daten/Work' );

$request = $_SERVER['REDIRECT_URL'];
include (SERVER_ROOT.$request);

test.php
PHP:
<?
//session_start();
?>
<pre>
<? print_r($_SESSION); ?>
</pre>
<?php

class myObject {

  var $num=0;

  function show() {
   echo $this->num;
  }

  function increment() {
   $this->num++;
  }

  function __sleep() {
   return array_keys( get_class_vars('myObject') );
  }

  function __wakeup() {}
}

if ( session_is_registered('lutscha') ) {
 $lutscha =& $_SESSION['lutscha'];
 $lutscha->show();
 $lutscha->increment();
} else {
  $lutscha =& new myObject();
  session_register('lutscha');
}
?>

Ich bekomme immer folgenden Fehler:

Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>myobject</b> of the object you are trying to operate on was loaded _before_ the session was started in /Volumes/Daten/Work/XXX/lib/config/1/test.php on line 30

Das komische ist, wenn ich die Session in dem Skript "test.php" (aktuell
auskommentiert) starte, und es in der Datei "rewrite.php" auskommentiere,
funktioniert alles wunderbar.
Die Session aber wird trotzdem vor dem betreffendem Objekt gestartet,
jedoch ohne Probleme!
Im Prinzip also das Selbe, bis auf unterschiedliche Dateien.
Aber genau das ist es ja, das ich die Session IMMER in "rewrite.php" starten
will, und auch während der Laufzeit, um diese optimieren zu können,
Objekte mittels include einbinden will und ggf. in der Session speichern.

Ich hoffe das Ganze war verständlich erklärt. Ich hoffe ihr habt da bereits
Erfahrungen gesammelt, bzw. habt Lust selbst etwas herauszufinden :)

Gruß,
Michanismus


EDIT:
Mit "normalen" Variablen die in $_SESSION geschrieben werden funktionierts
bestens.

Beispiel:
PHP:
if ( session_is_registered('lolli') ) {
 $_SESSION['lolli']++;
 echo $_SESSION['lolli'];
} else {
 $lolli = 1;
 echo $lolli;
 session_register('lolli');
}
 
Zuletzt bearbeitet:
Hast Du auch einmal einen Blick ins Manual geworfen?
Wenn Sie $_SESSION (oder $HTTP_SESSION_VARS) verwenden, sollten Sie nicht session_register(), session_is_registered() und session_unregister() verwenden.

Außerdem steht es bereits in der Fehlermeldung und auch im Manual
Falls Sie session.auto_start aktivieren, können Sie keine Objekte in Ihre Session aufnehmen, weil die Definition der Klasse vor dem Start der Session geladen werden muss, damit die Objekte in Ihrer Session wiederhergestellt werden.
Objekte und Klassen müssen bevor die Session gestartet wird, definiert werden.

Pingu
 
Pingu schrieb:
Hast Du auch einmal einen Blick ins Manual geworfen?

Ja, habe ich. Und wie du nicht gesehen hast arbeite ich mit
"session_is_registered". Des Weiteren wird der Name und das Objekt auch
in der Session gespeichert, nur leider ist es nach dem ersten Aufruf nicht über
das Objekt ansprechbar, da der Name flöten gegangen ist.

print_r($_SESSION) liefert:
...

[lutscha] => __PHP_Incomplete_Class Object
(
[__PHP_Incomplete_Class_Name] => myobject
[num] => 232
)
...

Pingu schrieb:
Außerdem steht es bereits in der Fehlermeldung und auch im Manual

Objekte und Klassen müssen bevor die Session gestartet wird, definiert werden.

Pingu

Hmm, komisch finde ich dann aber, dass wenn ich die Session in der
test.php starte und Klasse auch in dem Fall danach definiert wird,
alles funktioniert. ;)
 
Nur weil es manchmal funktioniert wenn man es anders macht, heißt nicht, daß es ein Fehler ist, wenn es mal nicht funktioniert.

Denn die Dokumentation ist in diesem Punkt mehr als eindeutig (der Hinweis steht sogar in einer großen Achtung-Box). Die Definition muß vor der Registrierung der Sesssion erfolgen.
Also:
  1. class ... { }
  2. session_start()
  3. Klasse benutzen

Wie gesagt, wenn Du es anders machst als es in der Dokumentation beschrieben ist, brauchts Du Dich auch nicht über komische Seiteneffekte wundern.

Pingu
 
Dann werde ich das wohl so benutzen müssen, auch wenn es ein wenig
verwirrend ist. :/

Hat jemand Erfahrungen mit der .htacces und meinem Plan?
Gibt es da evtl. Konflikte oder Probleme. Wäre gut zu wissen, nicht das ich
anfange wie ein Wilder zu schreiben und nach 10000 Zeilen Code darf ich alles
umbauen.

Viele Grüße,
Michanismus
 
maceis schrieb:
Ergänzend empfielt sich diese Lektüre (insb. oberster Abschnitt).

Das kannst du dir auch klemmen, zumindest wenn du nix zum Beitrag leisten kannst. Egal ob du nu Moderator bist oder nicht. Solltest du nen (evtl.)
intelligenten Tip haben, kannst das auch per PM machen.

P.S. Hast du denn mal meine Skripte ausprobiert? Vielleicht verstehst du dann
meine Vermutung.
 
Zuletzt bearbeitet:
michanismus schrieb:
Hmm, komisch finde ich dann aber, dass wenn ich die Session in der
test.php starte und Klasse auch in dem Fall danach definiert wird,
alles funktioniert. ;)

Es steht in der Datei danach. Aber das ist egal. Die PHP Datei wird zuerst komplett geparst, und erst dann wird die Ausführung gestartet,

Das siehst du daran, daß wenn ein Parsing Fehler auftritt, nicht eine Zeile ausgeführt wird, egal wo der Fehler ist.

Oder schau dir das an:

Code:
<?php

print hw();

function hw() {
  return "Hallo Welt";
}

?>

Da steht der Funktionsaufruf auch früher als die Definition.
 
Nogger schrieb:
Es steht in der Datei danach. Aber das ist egal. Die PHP Datei wird zuerst komplett geparst, und erst dann wird die Ausführung gestartet,

Das siehst du daran, daß wenn ein Parsing Fehler auftritt, nicht eine Zeile ausgeführt wird, egal wo der Fehler ist.

Oder schau dir das an:

Code:
<?php

print hw();

function hw() {
  return "Hallo Welt";
}

?>

Da steht der Funktionsaufruf auch früher als die Definition.

Okay, nur leider scheint der Include Befehl dieser Definition nicht zu
folgen :(
Oder?
 
michanismus schrieb:
Das kannst du dir auch klemmen, zumindest wenn du nix zum Beitrag leisten kannst. Egal ob du nu Moderator bist oder nicht. Solltest du nen (evtl.)
intelligenten Tip haben, kannst das auch per PM machen.
...
Wer Großer SESSION Bug in Verbindung mit Objekten!? als Titel wählt, sollte IMHO einen solchen Link auch verkraften.

Klar hätte ich Dir das auch per PN schicken können.
Auf der anderen Seite finde ich die "Smart Questions" so gut, dass ich es sinnvoll finde, wenn andere das auch kennenlernen und lesen.

Ich wollte Dich damit aber nicht persönlich angreifen.
Falls Du es so aufgefasst hast, tut mir das Leid, und ich entschuldige mich hiermit bei Dir.
 
michanismus schrieb:
Okay, nur leider scheint der Include Befehl dieser Definition nicht zu
folgen :(
Oder?

include bindet eine andere Datei erst zur Laufzeit ein. Erst dann wird diese Datei wiederrum komplett geparst und dann ausgeführt.

include ist keine Präprozessor-Direktive wie #include bei C o.ä.

Insofern stimmt meine Ausage von oben, daß bei einem Parsing Fehler nichts ausgeführt wird, nur im Rahmen des jeweiligen Dateiinhalts.
 
Nogger schrieb:
include bindet eine andere Datei erst zur Laufzeit ein. Erst dann wird diese Datei wiederrum komplett geparst und dann ausgeführt.

include ist keine Präprozessor-Direktive wie #include bei C o.ä.

Insofern stimmt meine Ausage von oben, daß bei einem Parsing Fehler nichts ausgeführt wird, nur im Rahmen des jeweiligen Dateiinhalts.

okay, das heisst ich muss alle nötigen objekte/klassen in der datei rewrite
definieren und durch include muss das ganze vor dem session_start() stehen.
danke schonmal soweit.

@nogger
denkst du das es probleme gibt mit der laufzeitverarbeitung... ich meine
modRewrite und einbinden durch rewrite.php?

danke und grüße,
Michanismus
 
Zurück
Oben Unten