« 1 2 »
Autor Zpráva
Suta
Profil
Jedná se o toto:
- mám na stránkách on-line počítadlo lidí, kteří si právě prohlížejí stránky
- mám to přes ip adresu a každých 5 minut aktualizuju počet

- chci to předělat, aby se zobrazovali pouze uživatelé, kteří jsou právě přihlášení a tady je ten problém
- když se přihlásí, zaregistruje se SESSION_proměnná s jeho uživ. jménem a zárověň si uložím údaj o tom, že se přihlásil ten a ten uživatl
- jak však zjistit, zda po určité době (např. 5 minut) uživatel na stránkách ještě stále je? Když se odhlásí, tak je to v pohodě - při odhlašování si opět vymažu záznam o tom, že tam je... ale co když zavře okno a tedy neproběhne script s odhlášením?
- tady bych se právě potřeboval dostat ke všem session proměnný na serveru, pak by byla správa on-line uživatelů nejjednodušší...

Díky za rady.
djlj
Profil
Ještě bych do databáze ukládal time();, který by se při každém načtení stránky aktualizoval u určitého uživatele.
huhu
Profil *
myslim že přes databázi bys to měl jednodušší ... jak správa tak i kvůli bezpečnosti...když do toho pustíš každých pěti minut skript kterej ti odhlásí uživatele pokud nesplnil podmnku s časem tak ho to odloguje ... a máš to vyřešený
Suta
Profil
djlj
Ještě bych do databáze ukládal time();, který by se při každém načtení stránky aktualizoval u určitého uživatele.
no právěže neaktualizoval, když nevím, jakým zbůsobem zjistit, zda tam uživatel ještě je

huhu
jasně, tak to chci právě udělat, ale jak zruším tu SESSION_proměnnou konkrétního uživatele? Jak k ní získám přístup, když tato proměnná existuje pouze u něj (tedy přesněji mezi serverem a JEHO KONKRÉTNÍM prohlížečem) ?
djlj
Profil
Suta
A co uložit i tu session? :)
malek
Profil
a ako zrusi len tu session? hm toto funguje: session_destroy(46fc29070c85e7ffb876740661766ac4&co);
ci tam treba este nieco dopisat?
DoubleThink
Profil *
Není to trochu postavené na hlavu?

Obecnou vlastností Session je, pokud vím:

* jeho ztráta při zavření okna
* jeho ztráta při vypršení platnosti

Není potřeba žádná kontrola času - jednodše se nastaví délka platnosti session a hotovo.
Suta
Profil
DoubleThink
Jo, tak by to šlo (a dokonce by to pěkně vyřešilo - při zobrazení jakékoliv stránky bych vyslal dotaz, zda je zaregistrována uživatelova Session, a pokud ano, zaktualizuji v databázi údaj o uživatelově připojení na stránky).

A ještě k původnímu dotazu: můžu se tedy jako správce stránek dostat ke všem Session uloženým na serveru nabo nemůžu ???
Vetti
Profil *
casovo nastavis pohyb jednoducho - pomocou time() ktora sa zapise do db pri prihlaseni a porovnanim s aktualnou time() a ak je rozdiel vacsi ako xxxx(5 minut napriklad) nastane session_destroy() a je to (plus samozrejme prechod na index.php alebo odhlasovaciu stranku.
podla mojich skusenosti sa session ukladaju do (napriklad) temp adresara na serveri, teda ty ako spravca stranky (fakticky uzivatel sluzieb servera) sa k session ako takym nedostanes (a v mnou popisanom pripade hadam ani nepotrebujes). jedine ze by si bol spravca servera, na ktorom sluzba bezi (takto: spravca servera webzdarma.cz, spravca stranky suta.wz.cz)
Este - obycajne byvavaju session nastavene na 30 minut..
jozob
Profil
Vetti
"sa k session ako takym nedostanes"
Ja na mojom hostingu prístup k temporary adresáru mám. Ten hosting je riešený tak, že každý uživateľ má svoj temp. Takže záleží od hostingu.

Suta
Ako písal DoubleThink, čas nechaj na PHP. Konkrétne ide o direktívu session.cookie_lifetime. Ale v jednej maličkosti s DoubleThinkom nesúhlasím (alebo to upresním, neviem či to napísal jednoznačne) - pokiaľ je spomenúta direktíva nastavená na 0, platnosť session končí pri zavretí okna prehliadača, ak je táto hodnota vyššia, platnosť je určená v sekundách.
A čo sa týka tej databázy, ja to riešim tak, že prechádzam zakaždým všetkých uživateľov a keď je online, zistím či jeho posledná aktivita nebola moc dávno - v tom prípade ho z DB vymažem. Potom ešte porovnávam, či je aktuálna IPčka zhodná s nejakým záznamom v tabuľke, ak áno, aktualizujem čas, ak sa tam nenachádza, jednoducho vytvorím nový záznam. Ale s DB pracujem úplne pre iné veci - so session to nemá dočinenia. Najlepšie je ponechať kontrolu nad sessions serveru.
Hugo
Profil
Případně si můžeš nadefinovat vlastní funkci, která se bude o sessions starat, pak nad nimi budeš mít kontrolu.
http://mirrors.inway.cz/manual/en/function.session-set-save-handler.ph p
Vetti
Profil *
jozob: či je aktuálna IPčka zhodná s nejakým záznamom v tabuľke..

treba mysliet aj na to, ze v poslednom case sa coraz viac ludi dostane na net aj cez mobil, takze ja by som rozhodne na IP nic nestaval, tak isto este stale mame dialupistov...
jozob
Profil
Vetti
A to si myslíš, že oni nemajú IPčku? Veď to by nefungoval internet :-)
Suta
Profil
Fajn, je mi jasné, že nejlepší je správa přes session - zkrátka nastavím při přihlášení její platnost a je to :) Avšak:
1. je (tedy podle mě) blbost nastavovat její platnost třeba na pět minut (uživatel si bude číst třeba dlouhý článek, pak klikne na nějaký odkaz a už je odhlášený) - tady je další háček - co když chci každých pět minut testovat, jestli tam ještě je, ale platnost jeho session chci mít nastavenu dejme tomu na 15 minut?

A ještě k debatě o ukládání IP - spíš bych ji bral jako pomůcku navíc (jak psal jozob) - takto se dají pěkně rozlišit i počítače, které mají společnou IP:

$IPadresa=$_SERVER['REMOTE_ADDR']; // sem "naskládame" vše, co lze o čtenáři zjistit odděleno zavináčem (adresy uživatelů za proxy ap.)
if ($_SERVER['REMOTE_HOST'])
$IPadresa.='@'.$_SERVER['REMOTE_HOST'];
if ($_SERVER['HTTP_X_FORWARDED_FOR'])
$IPadresa.='@'.$_SERVER['HTTP_X_FORWARDED_FOR'];
if ($_SERVER['HTTP_FORWARDED'])
$IPadresa.='@'.$_SERVER['HTTP_FORWARDED'];
if ($_SERVER['HTTP_CLIENT_IP'])
$IPadresa.='@'.$_SERVER['HTTP_CLIENT_IP'];
if ($_SERVER['X_HTTP_FORWARDED_FOR'])
$IPadresa.='@'.$_SERVER['X_HTTP_FORWARDED_FOR'];
if ($_SERVER['X_FORWARDED_FOR'])
$IPadresa.='@'.$_SERVER['X_FORWARDED_FOR'];
jozob
Profil
Suta
"co když chci každých pět minut testovat, jestli tam ještě je"
Ak máš vysokú navštevovanosť a msylíš, že za tých 5 minút príde aspoň 1 užívateľ, možeš to kontrolovať tak, že odkontroluješ všetkých uživateľov pri každom spustení skriptu.
jozob
Profil
Teda blbosť... tak to nepôjde. Nemáš šancu zistiť, či je užívateľ tam, pokiaľ nie je aktívny (teda pokiaľ nerobí requesty)
Suta
Profil
jozob
To je nespolehlivé - zaprvé, a za druhé to právě nezjistím, jestli tam ještě je :)
jozob
Profil
Suta
Nie, nemožné :-)
Vetti
Profil *
K TEME - pritomnost uzivatela zistis len jeho aktivitou, takze ak najsikovnejsie je do kazdeho skriptu vlozit kod na jeho "casovy upgrade" - ja to tak mam a facha to celkom v poho, nakolko nevyzadujem kazdu sekundu presne info..

JOZOB vs IP - odchyt si niekoho napr v Kosiciach kto ma OW od OR a pozri si jeho IP.. Odchyt si niekoho s OW od OR v BA a pozri si jeho IP.. A ejha, objavena Amerika?? Ako je mozne ze ma taku istu IP.. Ale to sa neda, ved by nefungoval internet :xexe Teraz vazne: ja mam na stranke asi 2000 roznych uzivatelov s rovnakou IP :co
roberta
Profil
na IP zabudni. kamarát robí v jednej firme s asi 6000 zamestnancami a každý z nich má na internete rovnakú IP...
jozob
Profil
Vetti
Sorry, moc rýchlo som čítal Tvoj príspevok a z neho som pochopil, že niektorý ľudia nemajú IP, nie že niektorý ľudia majú rovnakú IP :-) V tom prípade sa Ti ospravedľňujem. Samozrejme, že sú podsiete... Inak by nefungoval internet - IPčky sú drahé a je ich málo.

Áno, IPčkou sa už nič neoplatí robiť. A stále neviem, čo sa tu zbytočne rieši - odpoveď je sessions a nechať riadenie na PHPčku, nešpárať sa do toho zbytočne.
jozob
Profil
Aj keď možno sa von dostane aj vnútorná IPčka - teda možno by sa to dalo ešte hlbšie diferencovať podľa nejakých sekundárnych IPčiek. Netuším, či niečo také existuje, ale možno že ano.
Vetti
Profil *
JOZOB no jo, lenze session si strasne velke ked stavias aplikaciu aj na tom aby to bolo kratucke tak sess nie je najlepsia volba.. ale to je uz ina tema :) A ze IP su drahe - nie je o com, vela firiem ponuka verejnu IP za mesacne poplatky hm... Ak si mozem dovolit malu prognozu, asi sa dockame siete dalsej generacie.. :bibka
Suta
Profil
Vetti
session si strasne velke ked stavias aplikaciu aj na tom aby to bolo kratucke tak sess nie je najlepsia volba..
- nějak jsem to nepochopil :)

Nevím, jestli mi to už náhodou nepřeskakuje, ale teď jsem ještě jednou pořádně přemýšlel nad tou svojí problematikou a co kdyby to bylo prostě úplně takto jednoduše?

Do všech stránek includuju script s počítadlem, které udělá toto:
- projde tabulku v databázi a vymaže všechny časy, které jsou starší dejme tomu 5-ti minut
- poté zjistí, zda existuje SESSION s hodnotou uživatelského jména (tedy je-li uživatel přihlášen)
- pokud session existuje, zapíše do databáze nový záznam o uživateli s aktuálním časem (pokud tam ještě žádný záznam není), případně opět zaktualizuje čas u uživatelova záznamu (pokud tam již byl)

Hm? Není to nejjednodušší? Nebo mi to už nemyslí?
Suta
Profil
jozob
Ja na mojom hostingu prístup k temporary adresáru mám
- a nevíš či nevíte někdo, jestli se můžu dostat stejně jako ty do toho tempu se SESSION? mám stránky na wz.cz ...
Vetti
Profil *
SUTA - ja sa hram prevazne s wapovymi aplikaciami a musim brat ohlad na penazenky uzivatelov v zavislosti na politiku operatorov xe a by si neveril kolko kb to papka :((

No a teraz tvoj pripad kym sa nezamotam aj ja :)

-prihlasenie - zapisat time() do db
-do kazdeho skriptu include: $teraz=time()
$cas_z_db=..SELECT FROM.. (cas z tabulky)
if ($teraz-$cas_z_db)>5 minut => odhlasit
else
UPDATE tabulka SET cas=time()

hadam je to spravne, pisem to uz trosku v deliriu.. xixi
Suta
Profil
Já to mám zase takto, hlavně komplikovanější, zapisuju totiž jak právě přihlášené uživatele, tak ty nepřihlášené (ty musím dle IP):

$ip_adresa=$_SERVER['REMOTE_ADDR'];
$aktualni_cas = time(); // čas vstupu na stránku
$interval_zaktualizovani = 300; // časová prodleva mezi dalším zaktualizováním počítadla

//nejprve vymažu všechny záznamy, které jsou starší pěti minut
...

//pak projdu uživatelská jména všech zaregistrovaných uživatelů a pomocí SESSION zjistím, kteří z nich jsou přihlášení
//pokud existuje SESSION - tedy uživatel je přihlášen:
$dotaz = MySQL_Query("SELECT uziv_jmeno FROM forum_uzivatele") or die($chybova_hlaska_spojeni_s_databazi);
while ($vysledek = mysql_fetch_array($dotaz))
{
if ($_SESSION[prihlaseny] == $vysledek[uziv_jmeno])
{
$dotaz_2 = MySQL_Query("SELECT uziv_jmeno FROM p_online_lidi WHERE uziv_jmeno = '".$_SESSION[prihlaseny]."' ") or die($chybova_hlaska_spojeni_s_databazi);
$vysledek_2 = mysql_fetch_array($dotaz_2);
if ($vysledek_2[uziv_jmeno] != "") MySQL_Query("UPDATE p_online_lidi SET cas_vstupu = '$aktualni_cas', ip = '$ip_adresa', jmeno_stranky = '$PHP_SELF' WHERE uziv_jmeno = '".$vysledek_2[uziv_jmeno]."' ") or die($chybova_hlaska_spojeni_s_databazi);
else MySQL_Query("INSERT INTO p_online_lidi VALUES ('', '$aktualni_cas','$ip_adresa', '".$_SESSION[prihlaseny]."', '$PHP_SELF')") or die($chybova_hlaska_spojeni_s_databazi);

//vymažeme předcházející záznam, kdy se zapsal údaj o návštěvníkovi stránek, který prozatím nebyl přihlášený
$smazani_predesleho_zaznamu = MySQL_Query("DELETE FROM p_online_lidi WHERE ip = '$ip_adresa' AND uziv_jmeno = '' ") or die($chybova_hlaska_spojeni_s_databazi);
}
}





//pokud neexistuje SESSION - tedy uživatel není přihlášen:
if (!isset($_SESSION[prihlaseny]))
{
$dotaz = MySQL_Query("SELECT id FROM p_online_lidi WHERE ip = '$ip_adresa' AND uziv_jmeno = '' ") or die($chybova_hlaska_spojeni_s_databazi);
$vysledek = mysql_fetch_array($dotaz);
if ($vysledek[id] != "") MySQL_Query("UPDATE p_online_lidi SET cas_vstupu = '$aktualni_cas', jmeno_stranky = '$PHP_SELF' WHERE id = '".$vysledek[id]."' ") or die($chybova_hlaska_spojeni_s_databazi);
else MySQL_Query("INSERT INTO p_online_lidi VALUES ('', '$aktualni_cas','$ip_adresa', '', '$PHP_SELF')") or die($chybova_hlaska_spojeni_s_databazi);
}




No a právě jsem nahraný, protože mi ještě stále nefunguje to poslední, co potřebuju, tedy když uživatel zavře okno, tak abych okamžitě zrušil záznam o tom, že tam není... k tomu se právě potřebuju dostat k té session, k níž nevím jak se dostat... chapito?
jozob
Profil
Suta
"tedy když uživatel zavře okno, tak abych okamžitě zrušil záznam"
session.cookie_lifetime=0

A čo sa týka tých session, na čo potrebuješ mať prístup k tmp? Inak ten prístup by si tam mal mať, len ho nemáš cez FTP. Skús ini_get("session.save_path"). V tej direktíve sa nachádza cesta k sessions.
Vetti
Profil *
když uživatel zavře okno, tak abych okamžitě zrušil záznam o tom, že tam není...
to ako budes robit rucne? lebo okamzite to asi sotva sa bude dat automaticky (skriptom).. Pozri, vsetky data na stranke su PLNE AKTUALNE pokial ktokolvek neurobi na stranke pohyb.. ak je vas na stranke 5 a jeden z nich odide od pc alebo zavrie prehliadac a do 5 minut sa nevrati, je fakticky online ako pre seba, tak aj pre ostatnych. ak sa ktokolvek z tych zvysnych styroch pohne, ukaze mu ze su uz len styria online..
neviem preco sa chces stale tvrdohlavo dostat fyzicky k session suboru, ale skus este jedno: pri prihlasovani zapis sessid do db a mozes ju dat stale kontrolovat. Inak uz naozaj neviem.. Alebo potom uz naozaj len postup od jozob, lenze na wz.cz to asi nepojde..
Suta
Profil
Vetti
Podívej, takto to právě chci (a ani to nemusím dělat tak, jak píšeš - myslím ukládání session do databáze - to je blbost, mě stačí kontrolovat, jestli zaregistrovaná session je shodná s některým uživatelským jménem zaregistrovaným v databázi, mám to na tomto principu)

ale skus este jedno: pri prihlasovani zapis sessid do db a mozes ju dat stale kontrolovat.

Jenže to je právě problém, totiž:
!!! - zaregistrovanou session můžu konktolovat pouze tím uživatelem, který ji vytvořil (pouze jeho prohlížečem)
!!! - pokud odejde (nestandartně zavře okno), tak nikdo kromě něj, kdo udělá na stránkách jakýkoliv pohyb, nezjistí, zda ta jeho session existuje či neexistuje (jelikož existovala pouze ve spojení jeho prohlížeče se serverem)


Nebo mi to už nemyslí?


jozob
session.cookie_lifetime=0
co to udělá?
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.