» »

[php] štetje prijavljenih uporabnikov!

[php] štetje prijavljenih uporabnikov!

shorvat ::

Lep pozdrav,

imam sledeč problem: na strani bi rad preštel prijavljene uporabnike. Trenutno imam izvedeno tako, da se uporabnik, ki se prijavi, doda v tabelo "prijavljeni". Ko klikne odjava ga iz te tabele izbrišem. Težava se pojavi takrat, ko kdo zapusti stran brez odjave. Npr.: vpiše v naslovno vrstico drug link, zapre okno s križcem oz. datoteka->zapri, klikne na link med priljubljenimi (verjetno je še kak način)

Kako naj izbrišem prijavljene uporabnike, če zapustijo stran na zgoraj opisane načine?

Pogruntal sem kako jih lahko brišem, če zaprejo explorer s križcem (preko javascripta). To pa ne upošteva zapiranja z Datoteka->zapri!

Je sploh možno to izvesti brez JavaScrit-a?

Hvala za pomoč, Sašo

jeti51 ::

Ja zabeleži si še čas uporabnikovega zadnjega ogleda strani... če je poteklo več kot, kaj pa vem, pol ure, ga samodejno odjavi, hkrati pa seveda tudi ustrezno popravi tabelo prisotnih uporabnikov (tako kot to narediš, ko se uporabnik lastnoročno odjavi).

:)

shorvat ::

Nočem imeti zamika! Na strani kjer to potrebujem mora biti zadeva izpeljana brez zamika, ker preverjamo, če se prijavi uporabnik iz dveh računalnikov naenkrat z istim up. imenom. Če se to zgodi, ga blokiramo!

AndrejS ::

To boš pa težko izvedel. Edina možnost je da narediš en frame , ki se non-stop refresha - recimo na 5 sec. Podatke o prijavljenih uporabniki pa raje zapisuj v Application space, kot pa v bazo.

Ziga Dolhar ::

shared memory
https://dolhar.si/

shorvat ::

To se da izvesti, saj sem že na več straneh opazil statistiko prijavljenih uporabnikov. Primer je tudi phpBB forum. Izpis na tem forumu:

Trenutno forum pregleduje 8 uporabnikov :: 2 registriranih in 6 gostov

shorvat ::

Aja, pozabil sem vprašati, kaj je to "Aplication space"?!

Ziga Dolhar ::

Grr
https://dolhar.si/

jeti51 ::

>>Nočem imeti zamika! Na strani kjer to potrebujem mora biti zadeva izpeljana brez zamika, ker preverjamo, če se prijavi uporabnik iz dveh računalnikov naenkrat z istim up. imenom.

Luba duša, pa kakšen zamik neki? Vprašal si, kako izbrisati uporabnike, ki zapustijo stran na "nenavaden" način (ne kliknejo Odjavi) in predlagal sem ti rešitev s timeoutom, ki ga poljubno določiš.
To, kar si v drugem postu vprašal, je pa čisto nekaj drugega, namreč preverjanje morebitnih podvojenih prijav. V tem primeru pa, ko se uporabnik želi prijaviti, preveriš v bazi (oz. v Application Space če boš tja zapisoval), ali je uporabnik morda že prijavljen ter nato ustrezno ukrepaš.

jeti51 ::

Če pa želiš odjaviti uporabnika takoj v tistem trenutku, ko zapusti stran na neobičajen način - v splošnem pač ne moreš.Vedno bodo obstajale situacije, ko tega enostavno ne boš mogel ugotoviti. Morda se uporabniku browser sesuje, morda mu je na računalniku nenadoma elektrike zmanjkalo... lepo uporabljaj timeout na strežniku, pa je.

shorvat ::

jeti51: ne bo šlo to kar tako, kot si ti predstavljaš. Ne smem brisati uporabnikov po določenem času.
No, naj razložim na primeru:

V sistem se prijavi uporabnik z up. imenom "xy". Ta uporabnik bo na stani ostal 40 min. Stran je sprogramirana tako (po tvoje), da briše iz tabele vse zapise, kjer je čas prijave zaostaja za več kot 15 min za trenutnim časom. In zgodi se, da se 20 min po prijavi tega uporabnika prijavi nekdo z istim up. imenom. V tem primeru lahko oba surfata po strani prijavljena z istim uporabniškim imenom. To ne pride v poštev.

Obenem bi rad izpisal število prijavljenih uporabnikov. Tudi v tem primeru ne bi bil izpis tak, kot je dejansko stanje, saj bi 15 min po prijavi izbrisalo userje iz tabele!

Bom probal naštudirati sistem z "Applicaton space". Na to se še ne spoznam! Upam da se bo s tem dalo rešit.

Če pa ima kdo bolj preprosto logiko pa naj prosim sporoči!

jeti51 ::

Ne, glej, uporabnika odjaviš, če je od zadnjega njegovega dostopa do strani minilo več kot N minut (ne od časa prijave, saj je logično). Če nekdo aplikacije ne uporablja več kot npr. 15 minut, lahko domnevaš, da se je pač pozabil odjaviti ali pa je kaj drugega prišlo vmes. Takrat ga avtomatično odjaviš in od tistega trenutka dalje se lahko z istim uporabniškim imenom prijavi nekdo drug.

Application space pa tu nima veze. To je samo alternativni način za shranjevanje začasnih podatkov o trenutno prijavljenih uporabnikih.

mte ::

nekaj mi ni jasno...a ti to poskušaš brez baze ali vsaj tekstovne datoteke?

Ziga: mislim da se bo prej moral naučiti kakšnih bolj osnovnih stvari preden se gre s pomnilnikom igrat, vsaj po mojem mnenju je zaradi razumevanja lažje za začetek s kakšno bazo ali text fajlom začet...

Zgodovina sprememb…

  • spremenil: mte ()

shorvat ::

Kako pa vem, kdaj je aplikacijo nazadnje uporabljal? Naj vedno vpišem v bazo "prijavljeni" čas, ko je stran osvežil?! Je še kak drug način?

Ziga Dolhar ::

> Kako pa vem, kdaj je aplikacijo nazadnje uporabljal? Naj vedno vpišem v bazo "prijavljeni" čas, ko je stran osvežil?! Je še kak drug način?

Lej ... ti "veš", da je user uporabljal aplikacijo po tem, da pošilja aplikaciji neke zahtevke. Zdej pa, če user sam ne "klika" po strani, lahko še vedno sam prepričaš browserja, da to počne. (Recimo z nekim skritim frejmom, ki ti "pinga" server [beri: mu prijazno da vedet, da je še vedno odpr] vsako minuto.) (Upam, da ti je koncept jasen in te "metakoda" ne bo zavedla v razmišljanje o icmp pingu ... :))
https://dolhar.si/

jeti51 ::

Sem še enkrat prebral njegov predzadnji post in sem prišel na misel, kaj ga morda moti (je malo nejasno napisal) - nekdo pride na stran in se prijavi kot Janez. Potem pa pusti aplikacijo na miru 15 minut oziroma toliko, da se zgodi timeout in se ga odjavi iz sistema. Nekaj minut zatem pride nekdo drug in se prijavi kot Janez (kar se med drugim tudi zapiše v tabelo trenutno prijavljenih uporabnikov). Nato pa spet prvi nekaj klikne in ker se je medtem drugi prijavil v sistem, lahko tudi prvi uporablja sistem pod uporabniškim imenom Janez - ker se je že prej prijavil kot Janez in se v tabeli trenutno prijavljenih uporabnikov prav tako nahaja Janez (zaradi prijave drugega uporabnika pod tem imenom).
No, ampak tako zadeva pač ne deluje.:) Namreč v tabelo trenutno prijavljenih uporabnikov imaš (upam?) poleg uporabniških imen zapisan tudi ustrezne SessionID-je. Na podlagi tega ločiš med Janezom, ki se je prijavil z računalnika A in Janezom, ki se je prijavil z računalnika B.

V našem primeru, ko prvega Janeza (uporabnika za računalnikom A) po timeoutu odjaviš iz sistema in se malo zatem z imenom Janez prijavi uporabnik z računalnika B, seveda uporabnik z računalnika A seveda NE BO MOGEL več uporabljati sistema kot uporabnik Janez, saj za njegov SessionID ni več ustreznega zapisa v tabeli trenutno prijavljenih uporabnikov, torej ga sistem obravnava kot neprijavljenega uporabnika.

Res tudi jaz mislim, da bi si moral še malo prebrati o Sessionih in podobnih zadevah. Potem boš namreč videl, da tvoje vprašanje pravzaprav nima smisla, saj do situacije, ki te skrbi, sploh ne more priti.

Zgodovina sprememb…

  • spremenil: jeti51 ()

shorvat ::

Hvala za odgovore, so mi pomagali. Vidim da je logika zelo preprosta, ampak sam nisem prišel do nje. Do sedaj nisem uporabljal SessionID vrednosti pri načrtovanju! Hvala!

Ziga Dolhar: Kako browser prepričaš, da sam pošilja zahteve strežniku? Gre z JavaScript-om, ki po določenem času (recimo minuti) osveži stran! A obstaja še kak drug način, pri katerem se stran nebi osvežila?

Ziga Dolhar ::

shorvat, seveda.

> Kako browser prepričaš, da sam pošilja zahteve strežniku? Gre z JavaScript-om, ki po določenem času (recimo minuti) osveži stran!

Že refresh meta tag ti to omogoča.

> A obstaja še kak drug način, pri katerem se stran nebi osvežila?

Morda, ampak ga ne poznam. Ampak to niti ni težava -- ti si predstavljaš, da se bo osvežila "stran", ki jo uporabnik trenutno gleda -- to bi bilo res moteče, da.

Ampak kamot pa nekam na stran vtakneš kak element, ki se osvežuje zgolj sam -- to recimo rešiš s frejmi ali iframe-i, ki jih v izogib nevšečnostim še skriješ.
https://dolhar.si/

rokpok ::

JavaScript ping:

		window.setInterval ("ping()", 60000);
		
		function ping () {
			
			if (window.XMLHttpRequest) {
				var XHR = new XMLHttpRequest ();
			} else if (window.ActiveXObject) {
				var XHR = new ActiveXObject ('Microsoft.XMLHTTP');
			} else {
				return false;
			}
			XHR.open ('GET', 'index.php?status=online', true);
			XHR.onreadystatechange = function () {
				if (XHR.readyState == 4) {
					if (XHR.status != 200) {
						alert ('PING ni uspel');
					}
				}
			}
			XHR.send (null);
		}
Rad bi bil pingvin.

jeti51 ::

>> A obstaja še kak drug način, pri katerem se stran nebi osvežila?

Da, narediš XMLHttpRequest iz javascripta (glej, kaj ti je rokpok napisal).

shorvat ::

Hvala za vse odgovore!

Brilko ::

Zaka pretiravate in neki fascinantno razmišljate na dolgo in široko. Kaj boš brez potrebe osveževal stran, kje si še to videl... :D

Pri vsakem zahtevku pač spremeniš čas aktivnega z tem ip-jem oz. usernameom, odvisn al maš usersystem al ne, ali kombinacijo.

Saj uporabnik ni več na strani oz. ne more z nobenim komunicirati (rečmo da mu en pošlje PM) če 2 ure bere eno stran, koga pa to zanima, pusti ga kot da ga ni na strani, kaj boš zdaj neki osveževal stran, kje ste še to vidl... razen če ni kričač... ( ;) )

mislim ej... Če že misliš met resno statistiko se raje izogbaj raznih "uslužbencev iskalnikov, ki ti šarijo po strani", kot pa da s tem paničariš... še enkrat, če ga ni N minut na strani, ga ni med aktivnimi, potem pa enkrat na dan brišeš tabelo, seveda zbrišeš vse katerih čas je manjši od tim() - N*60;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Izdelava svojega "dropboxa"

Oddelek: Izdelava spletišč
344531 (3008) techfreak :)
»

[php] preverjanje online uporabnikov

Oddelek: Programiranje
261924 (1580) cobrica
»

unset cookie

Oddelek: Izdelava spletišč
221775 (1582) tomitza
»

oop+php+sessions

Oddelek: Izdelava spletišč
152447 (2055) cahahopie

Več podobnih tem