[ Rodja_ki @ 04.06.2014. 11:13 ] @
Pozdrav ljudi, naisao sam na problem, kao sto tema kaze, da kada se korisnik ne izloguje vec samo zatvori browser se unusti sesija, ali to i nije toliki problem koliko je sto moram da uradim update tabele, i da upisem vreme kada se to desilo. Naime, moram imati upisano vreme zavrsetka rada u aplikaciji, jer se ne moze ulogovati posle toga ako nije upisano vreme. Takav zahtev od klijenta imam. Postoji li nacin da se ovo uradi? Sesiju mogu podesiti da istekne, to nije problem, ali sta da radim sa update-om?
[ plus_minus @ 04.06.2014. 11:26 ] @
session_destroy() je preporučljivo pozivati pre - header('Location:'.$_SERVER['REQUEST_URI']); exit; dakle, pre redirekcije ili refresh-a stranice, kako bi se npr. browser cookie učitao i reflektovao - instant. To je jedan od dobrih scenarija gde funkcija session_destroy() ima svoju ulogu tako što će dopustiti narednom posetiocu koji je tu - odmah nakon pola sekunde npr. da takođe, neometano upiše sebe ili podatke koji su vezani za tog korisnika. Jer, onda kada se 'akaju' sesije, taj jedan sess_sdf98as89g68a ** fajl je zaključan dok se skripta ne izvrši do kraja. Takoreći Locked. session_destroy() završava sa upisom i vezom i sa aktivnim korisnikom, te je samim tim baratanje podataka kroz sesije, precizniji.

Za tačan upis vremena, možeš slobodno koristiti i običnu microtime(true);
Hoćeš li vrednost koju dobijaš sa microtime(true) ubaciti u novi cookie, pa njega maknuti nakon upisa u bazu ili direktno u sesiju, zavisi od same aplikacije, od tebe takoreći.

U suštini mnogo prosto, samo fino obrati pažnju šta gde i kako i kada ćeš, ako ćeš da radiš sa sesijama, koristiti if(!isset($_SESSION['thisAndThat'])) $_SESSION['thisAndThat'] = 'that and that'; *(znači da se taj ključ u sesiji pravi samo jednom ako nije već napravljen) a kada ćeš koristiti unset, tu i tu sesiju.. ili ćeš je generisati iznova, uvek, na svakom requestu.

Zanimljive su te sesije. :)
[ plus_minus @ 04.06.2014. 11:37 ] @
Jedna mala ispravka.. nisam ni gledao šta sam kucao..

Ne session_destroy() - TO ne moraš da pozivaš gotovo nikada. Samo pusti da se sesija sama, po php.ini direktivi (timeout-u) ubije. Onda kada treba, onako kako je podešeno. Najbolje.

Nije session_destroy() već - session_write_close();

Dakle, sve što sam ispisao - true.

Samo zameni destroy() sa write_close()

Moja brzopleta malenkost, ne zameri.

:)

To je zapravo funkcija koja ti treba.
[ Jbyn4e @ 04.06.2014. 16:24 ] @
Nisam shvatio kako će to tvoje raditi u slučaju koji je naveo, tj.
Citat:
kada se korisnik ne izloguje vec samo zatvori browser
?
[ plus_minus @ 04.06.2014. 23:07 ] @
To bi valjda trebalo da može sa - connection_aborted()
A postoji i connection_status()

Mora da prošparta po priručniku malo. Pa da iskombinuje. Ne gine mu to.
[ vatri @ 05.06.2014. 07:54 ] @
Ne znam jel radi, ali mozda mozes probati sa window.unload ili http://api.jquery.com/unload/ . Dakle, taj dogadjaj da pokrene AJAX sa kojim upises u bazu kad je zatvorio stranicu / uradio "refresh". Kad se ponovo ucita stranica upise u bazu da je logovan ili obrise prethodni red. Mozes to voditi na principu nekog dnevnika pa onda za statistiku odgovarajuce SQL upite pokretati...
[ plus_minus @ 05.06.2014. 08:40 ] @
Ne treba mu .js za ovakve slučajeve uopšte. Šta kad dođe neki ćaknuti kao ja, sa isključenom javaskriptom, provere radi? Šta se onda dešava? :)
[ Targarijen @ 05.06.2014. 23:38 ] @
Bojim se da se ovo ne može rešiti bez JS jer je HTTP protokol bez pamćenja stanja (stateless) ! Mislim da rešenju koje je predložio vatri nedostaje samo funkcija keepAlive() u kombinaciji sa vremenski ograničenim sesijama.

Citat:
To bi valjda trebalo da može sa - connection_aborted()
A postoji i connection_status()


Ovo nema veze sa postavljenim pitanjem jer se odnosi na zahtev koji server trenutno obrađuje i korisno je samo u slučaju dugih obrada. U tom slučaju server može da proveri da li je klijent u međuvremenu otkazao zahtev.
[ plus_minus @ 06.06.2014. 03:08 ] @
Jel' nema veze sa postavljenim pitanjem? A s' čim ima veze?
[ Targarijen @ 06.06.2014. 07:25 ] @
^To je odgovor na pitanje:

Kako da proverim da li je veza sa klijentom čiji se zahtev trenutno obrađuje i dalje aktivna?

Ako sam ja dobro razumeo Rodja_ki želi da postigne nešto sasvim drugo.

@Rodja_ki, možda možeš da razmotriš i korišćenje WebSocketa i uspostavljanje dvosmerne veze sa serverom, mada je to dodatna komplikacija. Pogledaj ovu biblioteku http://socketo.me/

[Ovu poruku je menjao Targarijen dana 06.06.2014. u 08:36 GMT+1]
[ Rodja_ki @ 06.06.2014. 09:10 ] @
Hvala vam na odgovorima, bio sam zauzet drugim problemima, u sustini, sa ajaxom sam pokusao, i nisam uspeo. Pokusacu sa vasim predlozima, proguglacu jos, pa cu probati nesto da uradim (da ne kazem izmajmunisem :) ).
[ bantu @ 09.06.2014. 08:27 ] @
Vodiš sam računa o trajanju sesije, nemoj da to za tebe radi web server i onda ćeš da znaš kada je sesija invalidirana jer ćeš ti to da uradiš:
http://www.php.net//manual/en/session.customhandler.php

EDIT:
Mislim da ne moraš da implementuješ svu logiku nanovo, ima ova klasa, samo je extenduj i dodaj svoj dio koji loguje invalidaciju sesije:
http://www.php.net//manual/en/sessionhandler.open.php