Nekonečná smyčka při startování Session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Milo
Nette Core | 1283
+
0
-

Pokud si do session uložíte objekt, který ve své __wakeUp metodě používá SessionNamespace, tak dojde k zacyklení. Použije-li se SessionNamespace je zavoláno session_start(), unserializují se data, zavolá se __wakeUp objektů, a pokud je ve __wakeUp opět použito SessionNamespace vznikne smyčka.

// Původní kód
Debug::tryError();
session_start();
if (Debug::catchError($msg)) {
	@session_write_close(); // this is needed
	throw new InvalidStateException($msg);
}

self::$started = TRUE;

// Moje oprava
Debug::tryError();
self::$started = TRUE;
session_start();
if (Debug::catchError($msg)) {
	self::$started = FALSE;
	@session_write_close(); // this is needed
	throw new InvalidStateException($msg);
}

Nevím, jestli je to košér oprava a zda se o to má framework starat, smyčky se dá snadno dosáhnout i bez frameworku.

class Loop
{
    public function __wakeUp()
    {
        session_start();
    }
}

session_start();

$_SESSION['loop'] = new Loop();
David Grudl
Nette Core | 8228
+
0
-

Asi není správné, aby wakeup prováděl něco mimo objekt a třeba spouštěl session.

Milo
Nette Core | 1283
+
0
-

Správné to asi není, také jsem svůj kód přepracoval. Nicméně trvalo mi dost dlouho, než jsem kápnul na to, proč to loopuje. Pomohlo by i:

if( self::$startInProgress )
{
    throw new InvalidStateException("Session start is in progress. You can not start session again.");
}
self::$startInProgress = TRUE;
session_start();
self::$startInProgress = FALSE;