V Opeře se po přesměrování ztrácejí sessions

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

Včera jsem strávil hodně času zjišťování důvodu tohoto problému. Hlavní problém je v tom, že Opera když dostane hlavičku s redirectem, tak věrna svému sloganu „The fastest browser on Earth“ okamžitě vyšle nový požadavek a neobtěžuje se nejprve uzavřít předchozí spojení. A teď záleží na mnoha okolnostech v jakém stavu je zrovna session na serveru. Někdy se předtím, než přijde nový požadavek, stihne uložit a vše funguje, někdy ale ne. Když se ukládá do memcache, tak nikdy ne. Nyní se projeví další zajímavý bug. Když PHP ukládá session, tak si pravděpodobně nějak zamkne onen soubor a další přistupující vlákno jej nemůže číst. Proto Opera se správným PHPSESID dostane prázdnou session. Mezitím se původní session stihne uložit a po refreshi už se načte ta původní (vše co se uloží do té nové prázdné je navždy ztraceno v křemíkovém nebi). Řešení je až triviálně jednoduché, před zavoláním redirectu vynutit uložení session, tedy před tento řádek přidat

Environment::getSession()->close();

BTW proč je HttpResponse final, když existuje i interface a lze tedy předpokládat, že se bude používat vlastní implementace a může se hodit použít původní kód? A i HttpRequest není final?

David Grudl
Nette Core | 8170
+
0
-

nAS napsal(a):

Když se ukládá do memcache, tak nikdy ne.

Což je spíš chyba implementace úložiště, ne?

Když PHP ukládá session, tak si pravděpodobně nějak zamkne onen soubor a další přistupující vlákno jej nemůže číst. Proto Opera se správným PHPSESID dostane prázdnou session.

Tohle je divné, druhé vlákno by totiž mělo čekat. Na jakém OS a filesystému se tak děje?

nAS
Člen | 277
+
0
-

David Grudl napsal(a):

Což je spíš chyba implementace úložiště, ne?

No vzhledem k tomu, že se to projevuje úplně stejně jako když se session ukládá na disk, akorát se to projevuje vždy místo někdy, tak bych řekl, že rozdíl bude spíš v rychlosti odezvy nebo něčem podobném.

Tohle je divné, druhé vlákno by totiž mělo čekat. Na jakém OS a filesystému se tak děje?

Je to na Debianu lenny, PHP 5.3.3-0.dotdeb.0, ale dělo se to i na PHP 5.2.x . Filesystém teď z hlavy nevím, ale řekl bych, že bude nějaký standardní. Každopádně by to na to nemělo mít vliv, když se do děje i s memcache.

bojovyletoun
Člen | 667
+
0
-

Ještě checkni : Předvolby,Cookies nastav na přijímat všechny (Jen z navštívené ho místo = kromě 3rdparty může blbnout)

To samé v místní nastavení na dané stránce

nAS
Člen | 277
+
0
-

Jj, to je nastavené správně, Operu používám jako primární prohlížeč už mnoho let, takže ve špatném nastavení Opery to není.

David Grudl
Nette Core | 8170
+
0
-

A můžeš tohle chování ověřit na jednoduchém příkladu v čistém PHP? Problém totiž bude někde jinde.

nAS
Člen | 277
+
0
-

V čistém PHP se mi to nasimulovat nepodařilo. Naopak když jsem třídu pro práci se session v Nette vyměnil za moji starou, tak se problém projevoval stále. Když se v Nette před redirect dá sleep(1), tak to výrazně sníží pravděpodobnost, že se problém projeví, což nahrává myšlence, že se opravdu soubor se session nestihne dozapsat. Rád vyzkouším jakékoliv nápady, mě už ale nenapadá, jak lépe otestovat v čem by mohl být problém.

bojovyletoun
Člen | 667
+
0
-

Právě řeším problém s Operou. Mám user->setexpiration(měsíc,onclose=false).
V IE a FF po znovuotevření jsem lognutý, ale v Opeře ne. Přičemž v prohlížeči daný cookie expiruje za měsíc, což je OK. Myslíte že je to samý problém jako výše?

PS: session->close() nepomáhá

Editoval bojovyletoun (26. 12. 2010 13:18)

Jan Tvrdík
Nette guru | 2595
+
0
-

Jen doplním, že na webu signaly.cz máme reportovaný problém s přihlašováním v Opeře. Více informací nemám, chybu se nepodařilo reprodukovat.

bojovyletoun
Člen | 667
+
0
-

Sice Operu používám asi 5 let ale přehlídl jsem zásadní věc, dokonce jsem jí sem psal a sám přehlédl:

  • Pravé tlačítko – Upravit místní nastavení – Cookies – Při ukončení smazat nové cookies
  • samozřejmě povolit cookies
  • eventuálně:
    • smazat cookies v browseru – cookie manager
    • smazat cookies na servru v složce session (nebo bůhvíkde)
  • (edit)potvrzená fakta: ruční uzavírání session->close ani třetí parametr u login (smazat identitu) na to nemají vliv-funguje to tak jako tak

Editoval bojovyletoun (30. 1. 2011 23:07)

David Grudl
Nette Core | 8170
+
0
-

Doplním do Nette možnost logovat vytváření sessions, tak to snad pomůže.