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
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
Asi není správné, aby wakeup prováděl něco mimo objekt a třeba spouštěl session.
- Milo
- Nette Core | 1283
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;