Kolize session při ajaxových požadavcích

- kuon
- Člen | 25
Ahoj,
už na tom trávím několik dní a pořád to nemohu vyřešit. Používám
v Nette knihovnu elFinder pro sdílený disk, která posílá několik
rychlých ajaxových požadavků za sebou, což způsobí kolizi session a
odhlášení uživatele, respektive založení nové session a ztráty
předchozích dat.
K založení nové session mi docházelo i čistě jen v Nette při rychlém ajaxovém načítání odkazů na handle metody. Předělal jsem tedy session ze souborů na ukládání do databáze a od té doby se mi to v Nette nepodařilo „shodit“. Ale v elFinderu to zlobí pořád.
V Nette používám pro session databázi s vlastním handlerem. V neon souboru nastavuji i vlastní jméno:
session:
handler: @sessionHandler
name: ZIVASESSID
To mi vše funguje. ElFinder jsem záměrně nechal na FS a nastavuji
odlišný název: session_name('ELFINDERSESSID'). I přesto mají
potom dané rozdílné cookies stejnou hodnotu session ID, což podle mě
způsobuje tu kolizi. Zkoušel jsem ukončit session v Nette před načtením
knihovny elFinderu, zastavení a znovu načtení nebo
session_regenerate_id(true); přímo v souborech elFinderu. Vše
bez úspěchu.
session_regenerate_id(true);
session_name('ELFINDERSESSID');
session_save_path('/disk_1/www/cz/zivasit/beta/temp/session');
session_set_save_handler(new \SessionHandler(), true);
session_start();
ElFinder prostě nějakým způsobem používá stejné session ID a přepisuje mi tím session pro Nette místo svoji. Nemáte někdo nápad, jak to vyřešit? Moc děkuji.

- Marek Bartoš
- Nette Blogger | 1319
Je v podstatě nemožné mít dvě sessions v jednom requestu, takto
designovaná nebyla.
Při rychlém průzkumu knihovny jsem našel
class elFinderSession implements elFinderSessionInterface –
udělej si vlastní implementaci ve které jako klíč použiješ hodnotu
z vlastní cookie a máš vyřešeno.

- kuon
- Člen | 25
Díky za odpověď, ale to jsem udělal hned jako první a nepomohlo. Možná to dělám blbě. Posílám upravený kód souboru elFinderSession.php, jestli bys na to mrknul, kde dělám chybu…
Do funkce get() jsem přidal podmínku
session_name() != 'ELFINDERSESSID' :
/**
* {@inheritdoc}
*/
public function get($key, $empty = null)
{
$closed = false;
if (!$this->started || session_name() != 'ELFINDERSESSID') {
$closed = true;
$this->start();
}
...další kód...
return $data;
}
Do funkce start() jsem přidal ukončení session, pokud jsou již
nastartované – tzn. s předchozí podmínkou jen v případě, že
session_name() != 'ELFINDERSESSID':
/**
* {@inheritdoc}
*/
public function start()
{
set_error_handler(array($this, 'session_start_error'), E_NOTICE | E_WARNING);
if ($this->started) {
error_log('KONEC NESPRÁVNÉ SESSION: '.session_name().'-'.session_id());
session_write_close();
}
if ($this->fixCookieRegist === true) {
if ((int)ini_get('session.use_cookies') === 1) {
if (ini_set('session.use_cookies', 0) === false) {
$this->fixCookieRegist = false;
}
}
}
session_set_save_handler(new \SessionHandler(), true);
session_name('ELFINDERSESSID');
session_regenerate_id(true);
error_log('START: '.session_name().'-'.session_id());
if (version_compare(PHP_VERSION, '5.4.0', '>=')) {
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
} else {
session_start();
}
$this->started = session_id() ? true : false;
restore_error_handler();
return $this;
}
Editoval kuon (26. 11. 9:48)

- kuon
- Člen | 25
Vypisuji si error_log() při startu v Nette a potom při
nastartování a ukončení session v elFinderu. Log vypadá takto:
[26-Nov-2025 09:26:15 Europe/Prague] Nette: ZIVASESSID-fe887f5a120f05d2a9831e876394715b-/prihlaseni/-Cookies: Array
(
[_nss] => 1
[ZIVASESSID] => fe887f5a120f05d2a9831e876394715b
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
)
[26-Nov-2025 09:26:17 Europe/Prague] Nette: ZIVASESSID-fe887f5a120f05d2a9831e876394715b-/prihlaseni/-Cookies: Array
(
[_nss] => 1
[ZIVASESSID] => fe887f5a120f05d2a9831e876394715b
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
)
[26-Nov-2025 09:26:18 Europe/Prague] Nette: ZIVASESSID-e54850ee27152362d1fcd273666a757f-/kruh/disk/prvni?_fid=m9kl-Cookies: Array
(
[_nss] => 1
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
[ZIVASESSID] => e54850ee27152362d1fcd273666a757f
)
[26-Nov-2025 09:26:19 Europe/Prague] Nette: ZIVASESSID-d2efdb2b28b19e5d88c2705cebbc82d1-/kruh/disk/prvni?do=disk-kruh-connector&cmd=open&target=&init=1&tree=1&_=1764145577488-Cookies: Array
(
[_nss] => 1
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
[ZIVASESSID] => d2efdb2b28b19e5d88c2705cebbc82d1
)
[26-Nov-2025 09:26:19 Europe/Prague] START: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KONEC NESPRÁVNÉ SESSION: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-92ffb9ea3afb48e12fc3b601484f58a3
[26-Nov-2025 09:26:19 Europe/Prague] Nette: ZIVASESSID-92ffb9ea3afb48e12fc3b601484f58a3-/kruh/disk/prvni?do=disk-kruh-connector&cmd=subdirs&targets%5B%5D=t4_Lw&targets%5B%5D=t3_Lw&targets%5B%5D=t2_Lw&targets%5B%5D=t1_Lw&targets%5B%5D=l4_Lw&preventDefault=true&reqid=19abf454030270-Cookies: Array
(
[_nss] => 1
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
[ZIVASESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
[ELFINDERSESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
)
[26-Nov-2025 09:26:19 Europe/Prague] START: ZIVASESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KONEC NESPRÁVNÉ SESSION: ZIVASESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] START: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:19 Europe/Prague] KOENC: ELFINDERSESSID-d65744fe923ad5a5a06a8ddb21bbc973
[26-Nov-2025 09:26:20 Europe/Prague] Nette: ZIVASESSID-db266807fd1895332ced23b02d57004d-/kruh/disk/prvni?do=disk-kruh-connector&cmd=subdirs&targets%5B%5D=l3_Lw&targets%5B%5D=l2_Lw&preventDefault=true&reqid=19abf45403024f-Cookies: Array
(
[_nss] => 1
[nette-debug] => abcdef
[tracy-session] => 3cb8f9f827
[ZIVASESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
[ELFINDERSESSID] => 92ffb9ea3afb48e12fc3b601484f58a3
)

- Marek Bartoš
- Nette Blogger | 1319
Nechápeme se :)
Pořád tam máš konflikt dvou různě pojmenovaných sessions. Předtím jsi
tam měl dva různé přístupy ke stejné session (nativní a z Nette), což
nejspíš též dělalo potíže.
Udělej si kompletně vlastní implementaci elFinderSessionInterface. Možná ti
bude stačit jen tam použít Session z Nette, ale spíš bych se přikláněl
k možnosti udělat to bez session. Zjednodušeně vzato je session jen klíč
uložený v cookie a data která se pod tímto klíčem ukládají na serveru.
Můžeš si tak progress ukládat třeba do dočasných souborů a netrápit se
tím, proč se ti sessions přepisují

- kuon
- Člen | 25
Tak problém bude asi někde jinde… Kompletně jsem si to přepsal na používání vlastních souborů místo standardních session a Nette si stejně při ajaxovém požadavku v rámci elFinderu založí z nějaké důvodu novou session, i když mu do ní podle mě vůbec nesahám. Jak zjistit k čemu tam skutečně dochází? Debugger mi nic nevypíše.