Jump to content
php.lv forumi

Lietotāju, kas ir online - parādīšana


Toms

Recommended Posts

Ir lietotāju tabula un online tabula.

Lietotāji:

id

vards

uzvards

Online:

id

u_id

 

Kad lietotājs ielogojas, viņa ID tiek ierakstīts iekš online tabulas.

Lai kāds cits varētu redzēt, kas ir onlainā, notiek šādi:

1)SELECT no online tabulas (noskaidro visus, kas onlainā)

2)SELECT no lietotāju tabulas (dabū vārdus, uzvārdus pēc ID, kas saņemti no online tabulas)

 

VARIANTS #2:

Online tabula šāda:

id

u_id

vards

uzvards

 

Lai redzētu, kas onlainā:

1)SELECT un uzreiz parādam visus ar vārdiem, uzvārdiem.

 

TĀTAD:

1)Notiek divi select (viens mazāks, otrs lielāks pēc informācijas daudzuma.)

2)Viens selects (online tabulā glabājas visa lietotāja info, kad viņš onlainā)

Pieņemot, ka onlainā ir

*) 1000

*) 4000

lietotāji.

Kurš variants labāks?

Link to comment
Share on other sites

A kāpēc neiztikt ar vienu tabulu?

lietotaji (id, vards, uzvards, online CHAR(1))

 

Kad lietotājs ielogojas: UPDATE lietotaji SET online='Y' WHERE id=$id

Kad izlogojas: UPDATE lietotaji SET online='N' WHERE id=$id

Kad vajag uzzināt visus tos, kuri online: SELECT * FROM lietotaji WHERE online='Y'

 

Neredzu jēgu taisīt citu tabulu 1:1 relācijai šitik maziem datiem.

Ja nu tomēr gribi lietot savu 1-o variantu, tad jau arī var iztikt ar vienu selektu:

SELECT lietotaji.* FROM lietotaji JOIN online ON lietotaji.id = online.u_id

Edited by bubu
Link to comment
Share on other sites

Kad lietotājs ielogojas: UPDATE lietotaji SET online='Y' WHERE id=$id

Kad izlogojas: UPDATE lietotaji SET online='N' WHERE id=$id

Kad vajag uzzināt visus tos, kuri online: SELECT * FROM lietotaji WHERE online='Y'

 

Šim risinājumam ir viena problēma. Lietotājs ielogojās un aizver browseri. Šis lietotājs pēc tam visu laiku rādās online. Ir vajadzīgs vēl kaut kāds timestamps, kurš jāupdeito pie katra lietotāja klika. Un tad jāselektē lietotāji, kuri ir kaut ko darījuši pēdējās x minūtēs.

Link to comment
Share on other sites

Nu a šī pati problēma nav arī tavā risinājumā? Tur arī neredzu nekādu timestampu. Bet pēc būtības - jā tev taisnība, piemet klāt kautkādu timestmapu, kurā glabāsi pēdējo laiku, kad lietotājs pieprasījis kautkādu lapu un viss būs ok.

Link to comment
Share on other sites

vienkaarshi

3 pieprasijumi

1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks

teiksim 3 - 5 min

2 pievieno ierakstu par lietotaaju un tekosho laiku (katram savs identifikaators)

- teiksim lietotaaja ID vai niks vai.......

 

3 paraada visus lietotaajus (raadot tikai tos kuri neatkartojas)

(skaitu utt)

--------

vissa tabula tiek glabaata atminjaa

(nav jeegas glabaat uz diska)

 

P.S. shii probleema jau ir daudzreiz apspriesta...... meklee tepat forumaa

Link to comment
Share on other sites

vareetu tabulaa lietotaaji pielikt veel vienu lauku expire, un to expire vajadzeetu updeitot pie katra klika (uzstaadiit tekosho laiku - time()), un peec tam atlasiit lietotaajus online ar shaadu vaicaajumu:

$query = sprintf("SELECT * FROM lietotaji WHERE online='Y' AND expire + %s >= %s", 360, time());

Edit: tjip 360 - 6 min

Edited by Analgiins
Link to comment
Share on other sites

1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks

teiksim 3 - 5 min - reizi X sekundēs/minūtēs

2 pievieno ierakstu par lietotaaju un tekosho laiku (katram savs identifikaators)

- teiksim lietotaaja ID vai niks vai.......

šeit būtu vēlams tabulā glabāt lietotāju unikālos ID un uzlikt uz to unikalitātes indeksu, bet pievienojot jaunu ierakstu izmantot REPLACE ... DELAYED- tādejādi par konkrētu lietotāju tiks turēts tikai viens jaunākais ieraksts, ar ko atkrīt papildus noslogošana ar 3

 

tālāk - rezultātus kešot, e.g. sessijā (protams, tur arī nevajadzētu dzīt kādus 2mb info, tikai kādus 10 "pēdējāko" jūseru id un info, bet tālāk rādīt ar atsev. linku "skatīt visus ūserus online", online liet. skaitu un vēl ko visnoderīgāko)

Link to comment
Share on other sites

sadaam lietaam velams tabulas tips HEAP

resp visi dati glabaajas op atminjaa :)

tas dos krietni aatraaku pieejas laiku

un nenoslogos disku

----

taapat tie dati vajadziigi tikai tad kad serveris straadaa un 3-5 min :)

- nav liela nelaime ja pie servera parstarteeshanas dati pazuud ;)

Link to comment
Share on other sites

Vienā tabulā neieteiktu visu glabāt, jo ja piemēram citur sistēmā pēc ID ir nepieciešams izvilkt vārdu, uzvārdu ļoti bieži un blakus vēl ir timestamp, tad tabula vislaik tiks atjaunota, tādā gadijumā mysql cache nevarēs uzlabot ātrumu.. jo tabulas dati tiks atjaunināti teju vai katru sekundi.

Link to comment
Share on other sites

teju vai katru sekundi.

21156[/snapback]

 

Tieši par šo arī domāju. tāpēc negribas vienā tabulā visu.

 

Laikam palikšu pie sava varianta #2, lai mazāk pieprasījumi lieotāju tabulai (atkritīs apskatīšanās, kas tieši ir onlainā, apdeitošana timestamp un atmešana visu, kas nav bijuši ilgāk par 10 min...)

Link to comment
Share on other sites

1. nodzeesh visus lietotaajus kuriem pagaajis noteikts laiks

teiksim 3 - 5 min - reizi X sekundēs/minūtēs

Ir pāris reizes bijusi līdzīga situācija. Ja lietotāju nav pārāk daudz, šo "tīrīšanu" var veikt nevis ik pēc noteikta laika, bet veicot pieprasījumu par tiešsaistē esošajiem lietotājiem. Kaut gan katrai situācijai savs risinājums

Link to comment
Share on other sites

vareetu tabulaa lietotaaji pielikt veel vienu lauku expire, un to expire vajadzeetu updeitot pie katra klika

 

pie katra klicka nevajag nemaz updeitot, pietiek ar glabasanu sessijaa pedeejo pielogosanas laiku un updeitosanu ieks db tikai ja ir pagajusas X laika vienibas kops pedeejas pielogosanas.

 

Kaitnieks: kas vainas uzprasiit kaa citi dara un paarliecinaaties ka pats daru vispareizaak :D

Link to comment
Share on other sites

Parasti shaadas atbildes necenshas izziist no pirksta (vai prasiit baram PHP praktikantu) bet noskaidrot, reaali notesteejot uz kaut kaadiem testa datiem.

21173[/snapback]

runaajot un kontakteejoties arii ar baru praktikanti var ieguut labas idejas

Link to comment
Share on other sites

×
×
  • Create New...