|
[ zgas @ 24.09.2009. 22:25 ] @
| Pitanje je jasno je iz naslova.
Negde sam citao da je moguce resenje za ovo beleziti svaku posetu bilo koje stranice u bazu, isl.
Ovo ne odgovara jer ne zelim da opterecujem bazu upitima.
Drugo, potrebno mi je da samo administrator vidi koliko mu je posetioca na sajtu, to je samo za njege bitno.
Posto ne zelim bazu da opterecujem upitima shvatio sam da se ovi podaci mogu izvuci iz dva izvora:
1. fajlovi sesija
2. neki log fajlovi servera
Molim vas da mi pomognete da odaberemi izvor koji je bolji da bi se doslo do ovog podatka. |
[ Nemanja Avramović @ 24.09.2009. 22:46 ] @
Odakle ti ideja da će to _toliko_ da optereti bazu? Ne vidim elegantnije, brže i bolje rešenje od korišćenja baze. A mislim da takva jedna skripta neće ni približno opteretiti bazu koliko ti misliš da hoće, osim ako nemaš sajt koji je baš baš dosta posećen, a u tom slučaju bi trebalo da imaš i više resursa na raspolaganju.
[ Lord_Nenad @ 25.09.2009. 00:34 ] @
Jedino ako hoces da ti bude "preglednije" i da se moze downloadovati, mozes to koristiti... Jer svakako za svaku stranicu ( verovatno ) ti je potrebno povezivanje sa bazom i bar 2-3 ucitavanja iz nje, pa onda zasto ovo ne bi moglo?
Ja imam ovako nesto, jeste da radi samo na pocetnoj strani, i upisuje se koji je korisnik ( ako je reg ), koja IP, koje vreme, sa koje stranice je dosao ( ukoliko je izvan mog domena )... I nema opterecenja uopste...
[ zgas @ 25.09.2009. 08:24 ] @
Sajt je inace programski vec dosta zahtevan.
Koristi licni PHP framework i includuje mnogo fajlova i pokrece dosta klasa za generisanje sadrzaja.
Nije dosta posecen, ali u planu je da bude. Cak i pri maloj posecenosti sajt ima takve Ajax delove koji
stalno zovu server i potrazuju neke podatke. Tako, iako nema trazenja nove stranice, dolazi do stalnog zvanja servera.
Nalazi se na shered hostingu, pa maksimalno moram viditi racuna da sto manje opterecujem hosting da se ne bi srusio.
Zato sam odustao od upisa ovih podataka u bazu pri svakom ucitavanju stranice.
Inace ako ove podatakea vec imam u session fajlovima, ili log fajlu servera to je jos jedan razlog.
Interesuje me samo koji izvor od ova dva preporucujete.
Sa log fajlovima servera nisam radio i nemam predstavu kakva je tu situacija.
Sto se tice SESSION fajlova, tu mi je malo problematicno.
Prilikom prijave korisnika na sistem i odjave korisnika sa sistema, regenerisem sission_id iz sigurnosnih razloga.
Tu se desava da se formira jos jedan sesion fajl, pa ko se korisnik prijavio, pa odjavio, samo on je vec kreirao 3 session fajla.
To mi moze dati pogresnu informaciju da je 3 korisnika online a ustari je samo jedan.
Da li mozda imate predlog kako ovo resiti?
[Ovu poruku je menjao zgas dana 25.09.2009. u 10:44 GMT+1]
[ zigizig @ 25.09.2009. 10:12 ] @
Posto koristis shared hosting onda ti brojanje file-ova ne pomaze jer i ostali sajtovi koriste isti folder. Mozes eventualno da definises svoj folder za session files, ali time narusavas sigurnost.
Mislim da ti je jedino racionalno resenje koriscenje baze.
Ali nemoj da se previse brines zbog performansi jer nece to da radi na svaki request.
[ zgas @ 25.09.2009. 10:20 ] @
Radio bi to na svaki request serveru (osim na ajax requeste) ako bih koristio bazu.
Direktorijum sessija sam vec odvojio.
Taj direktorijum nije dostupan korisnicima, ne nalazi se u javnoj "http" putanji. Ne znam da li to narusava sigurnost?
Ako ovo ne narusava sigurnost, izbegao bih koristenje baze.
[ zigizig @ 25.09.2009. 11:08 ] @
Ako se nalazi izvan siteroot direktorijuma onda mislim da je ok (pretpostavljam da imas read/write prava za php u tom novom direktorijumu)
Sto se tice session_regenerate_id mozes da uradis dve stvari.
Prva je da prosledis true kao parametar da bi se obrisao stari session fajl.
A druga opcija je da sam generises SID (ima dobrih primera na net-u) i da ne moras da pozivas regenerate* .
[ zgas @ 25.09.2009. 12:21 ] @
Sesije resavaju stvar ali veliki problem je prilikom regenerisanja id-a sesije, nikako se ne moze izbrisati stari fajl.
Svasta sam probao, ali PHP ga uopste ne brise mada UNLINK($file) se ponasa kao da ga je izbrisao.
To mi ostavlja fajlove koji nisu aktivni i koji mi daju laznu informaciju koliko je korisnika online.
Evo koda kako sam pokucao da iybrisem stari session fajl:
Code:
start_session();
$oldSessionId = session_id();
// create new file
session_regenerate_id(true);
// delete old file
$sessFilePath = $serverDir . '/sessions/sess_' . $oldSessionId;
if(file_exists($sessFilePath)) unlink($sessFilePath);
[ Nikola Poša @ 25.09.2009. 13:40 ] @
Pogledaj malo komentare korisnika na stranici te funkcije u manual-u: http://www.php.net/session_regenerate_id. Ovako na prvi pogled mi se čini da ti fali session_destroy(), odmah posle poziva session_regenerate_id() funkcije.
[ Miroslav Ćurčić @ 25.09.2009. 13:49 ] @
Apač takođe vodi log o poseti (access logs), ako je to na serveru uključeno.
Iskoristi taj log (parsiraj ga) ako postoji umesto da ti brojiš posete.
[ zgas @ 25.09.2009. 14:46 ] @
na apacheu imam log fajlove. Bio je ukljucen "Transfer Log", ali sam ga iskljucio jer kao sto sam gore rekao ajaks mi pravi mnogo zahteva serveru, pa mi oterecuje server. Imam jos "ModLogAn", "Referrer Log" i "Agent Log" i svi su iskljuceni. Ne znam koji od ovih logova sam mogao iskoristiti, ali ipak bih da resimo koliko korisnika imam na sajtu preko sesija fajlova jer oni svakako postoje.
Resio sam problem oko sesija.
Ovaj kod brise stari fajl i generise novu sesiju sa novim id-om (a sa starim podacima)
Code:
// destroy old
$data = $_SESSION;
session_destroy();
// start new
$noviId = ... rucno generisi (26 karaktera)
session_id($noviId);
session_start();
$_SESSION = $data;
Sada kada su sesije sveze sa ovim kodom, cini mi se da lako mogu da vidim, bez upisivanja u bazu, koji su korisnici online.
[Ovu poruku je menjao zgas dana 25.09.2009. u 16:47 GMT+1]
[ Lord_Nenad @ 25.09.2009. 15:51 ] @
Ako ides na logove servera, onda ti on nece praviti razliku izmedju AJAX-a i "obichnih" otvaranja stranica...
I tu bas moze da bude nezgodno ako se requestovi ponavljaju stalno, postane neuredno, 20 requestova jednog korisnika, 50 drugog itd...
Izvini, a zar ne mozes namestiti samo u stranicama koje se ne pozivaju preko AJAX-a da vrsi upis u bazu? Nije valjda da tom brzinom korisnici listaju stranice da ne mogu da se postignu zahtevi za upis u bazu?
I ova dva dela: "Nije dosta posecen, ali u planu je da bude." - "Nalazi se na shered hostingu, pa maksimalno moram viditi racuna da sto manje opterecujem hosting da se ne bi srusio." se ne uklapaju... Ako ce se srusiti ako dodas jos dva reda koda da bi upisao u bazu priliko otvaranja nove stranice, kako ce uopste raditi kada dodje 2x ( ili 10x ) vise korisnika i + salju AJAX zahteve? :/
[ impreza @ 25.09.2009. 18:50 ] @
Uuuuuuuuu jeeeeeeeeeeeee, sto bi nesto bilo lakse kada moze da bude koplikovano. Cini mi se da google analytics bas dobro belezi broj poseta, jeste li nekada razmisljali o tome???
[ Nemanja Avramović @ 25.09.2009. 19:06 ] @
GA ne nudi prikaz trenutnog broja posetilaca na sajtu (ili ja to ne vidim kod njih u dashboard-u)
[ dakipro @ 25.09.2009. 20:02 ] @
A i sumnjam da ima neki API da taj broj prikazes u administraciji sajta
[ zgas @ 25.09.2009. 20:30 ] @
Odlicano resenje je jednostavno da se procita broj fajlova sesija koji su modifikovani ili kreirani pre npr. 20 minuta i eto broj korisnika na sajtu.
Baza je najelegantnije resenje, ali meni je cilj da broj upita bazi podataka svedem na nulu, jer njih uvek ostavljam za kraj za najteze zadatke kao najaci adut.
Ako se upiti koriste neumereno mogu se vremenom nagomilati, a mislim da oni ipak najvise usporavaju i opterecuju procesor. Pa nije slucajno sto se select upiti kesiraju u neke fajlove i sl. Ne znam koliko gresim tu.
[ dakipro @ 25.09.2009. 20:47 ] @
Pa mozes to prakticno da izmeris, probas sa 5000 rekodra recimo bazu, i probas fajlove, ovako bez puno razmisljanja, ako se bojis performasi, cuvanje svega u bazi je dlacicu sporije, ali je zato vadjenje statistike iz baze nekako, po trenutnoj mojoj logici dok se ne dokaze suprotno, xxx puta brze nego brojanje session fajlova, pogotovo ako radis filtere po vremenu editovanja. Drugo, shared je hosting, mozda ti i zabrane ako nekako vide da petljas sa session fajlovima (mozda se uplase da ces da hakujes druge korisnike  ).
Bez razmisljanja bi se odlucio da cuvam te podatke u bazu, indeksirao to polje ili kako si ga vec zamislio... trenutno mislim da se plasis bauka, taj jedan insert/update u bazu nije tako spora stvar, siguran sam da na bilo kom kodu mozes naci barem 10-ak upita koji mogu biti bolje optimizovani i nadoknaditi to 'potroseno' vreme.
Mislim, probaj sa fajlovima, pa probaj sa bazom, iz jedno 40 uzoraka, uporedi vremena pa preseci...
[ zgas @ 26.09.2009. 10:22 ] @
Daki bas si mi pomogao sa dobrom savetom. Samo trebace mi vise vremena dok sve to probam u praksi za sada mogu samo da pretpostavljam.
100% je sigurno da je citanje statistike iz baze brze i tu je velika prednost. U mom slucaju, ne samo da brojim sesije i iscitavam kada je koja modifikovana, nego parsiram i podatke sesije da bih video koliko korisnika su gosti a koji su logovani. Tu je prednost baze ubedljiva.
Zasto sam za sada izabrao sesije:
Kao prvo, samo ja citam statistiku ko je na prezentaciji i to povremeno.
Kao drugo, specificnost moje prezentacije je sledeca:
Dugo vremena bi se posmatrale odredjene stranice (oko 1 sat, verujte). Istovremeno bi bilo od 100 - 200 korisnika.
Ajaks na svakoj stranici svake minute modifikuje sesiju (odnosno bazu) da registruje koliko je korisnika aktivno.
To znaci da za 100 korisnika, ako imaju otvorene po dve stranice, u jenom minutu bude izvrseno 200 modifikacija sesije (ili upita u bazi).
Zaislite da ima vise korisnika i da otvore vise stranica sa ovim ajaksom.
Pitanje je sta je za server manje bolno, da li da izvrsi ovoliko upita u bazi ili da modificira sesije?
Malo sam testirao i izvrsenje upita u bazi je brze, ali ja svakako moram starujem i sesiju.
Pretpostavljam da bi mi sesija bila bolje resenje zbog toga sto je svakoko startujem pa da ne vrsim onda i dodatni DB upit?
[Ovu poruku je menjao zgas dana 26.09.2009. u 11:54 GMT+1]
[ dakipro @ 26.09.2009. 11:11 ] @
Pravio sam ja slicno nesto, i veruj mi, uooopste nije problem to ubacivati u bazu. Takodje razmisli da li ti je bas potreban ajax na 1min, jer ako ga stavis na 2 minuta imas duplo manje poziva, na 5 minuta pet puta manje i tako. Mi smo koristili na 15 minuta, jer ako za to vreme korisnik sam ide dalje, ajax se i ne poziva, a znaci da je korisnik prisutan. Mislim da je 1min previse, ali ako imas potrebe, ok. Ovako gledano, povremeno gledanje statistike za tvoje potrebe ne bi (po meni) opravdalo toliko poziva. Mozda i da odvojis recimo registrovane/logovane, da u users tabeli imas polje last_visit, i ako imas bilo koji upit nad bazom, samo kazes da update tog polja na trenutno vreme. Taj isti kod stavis na pocetku glavnog (fajla koji se uvek poziva) fajla, on se izvrsava pri svakoj poseti. Odmah iza imas kontrolni parametar u get-u, recimo AJX=1 i ajax uvek salje taj parametar, pa skripta odma tu prekida dalji rad sa exit, tako da ti to mnoooogo rasterecuje kod, jer ajax ne ide dalje kroz kod onda. Ako ovo sa exit do sada nisi imao, taman ce ti to kompenzovati da u jednu drugu tabelu za posete imas polja
session_id i visit_time, pa ako korisnik nije logovan, ubacis podatke u tu tabelu (ili za obe grupe korisnika odmah ubacis u tu tabelu, kako ti lakse). Naravno, trebace ti i kron koji ce brisati statistiku stariju od recimo mesec dana. Ovim pristupom mozes imati mnoooogo bolju statistiku, recimo, vidis kada ti je sajt naj poseceniji, odmah mozes da provalis kakve navike ima vecina tvojih posetioca, kada je dobro ubacivati reklame ili vesti, i sve to recimo mesec dana unazad, za odabrani period. Sa sesijama i fajlovima, toga nema.
Opet te ubedjujem da razmislis dobro o bazama, jer tu ima mesta za optimizaciju i prakticnu upotrebu, pa posle mozes i prebaciti to da koristi fajlove za sesije ako ti se pokaze kao ne dovoljno optimizovano, za sada sam stekao misljenje da se samo plasis bauka, uopste mi taj gubitak performansi ne deluje kao potreban uslov za koriscenje i parsiranje fajlova. Ok bi bilo da vec koristis baze pa da primetis usporenje, ovako, iskreno mislim da su baze bolji i brzi pristup, ali ako si cvrsto resio za fajlove, pici tako (znam ja kad se za nesto uhvatim, tesko popustam  )
A ako listas sesije kao fajlove generic funkcijama, opet kazem, nece ti biti toliko tesko da proveris sta je brze, mislim, kao kad komanderom/explorerom otvoris folder koji ima 5000 fajlova, to je booolno samo tako.. a recimo backup baze od 5000 rekorda traje manje od 1sec, znaci citanje fajlove i citanje rekorda iz baze se toliko razlikuju, da je to po meni bolno porediti.
Moje vidjenje, ne mora da znaci da sam u pravu 
[ zgas @ 26.09.2009. 15:12 ] @
Jasno mi je da je baza pesma. I veoma je moguce da se plasim bauka. Ali evo sta me je zaista pokolebalo da ne koristim bazu za ove stvari.
Na dosta mesta na internetu (kao i u PHP dokumentaciji) pise u vezi sa Sesijama (moze se i primeniti na ovo sa brojem poseta jer se je slicna stvar u pitanju).
Od prilike pise: Sesije je moguce smestati u bazu podataka (i to je idealno sigurnostno resenje) ali treba uzeti u obzir da ce to opteretiti rad servera ako je server dosta posecen. Pitam se zasto nema opterecenja servera ako radi sa fajlovima, a ima ako radi sa bazom? Mozda su mislili samo db server a ne na apache server... provericu ako stignem.
[ misk0 @ 26.09.2009. 20:39 ] @
"Ako je server dosta posjecen" je jako relativna tvrdnja. Ako imas 100 posjeta u jednom momentu nije isto kao kad ih imas 1000.
[ zgas @ 28.09.2009. 08:17 ] @
Sumljam da ce moj sajt biti kali ovaj sto se tice posecenosti, ali bilo bi dobro da elitesecurity kaze kako belezi ove podatke ko je trenutno na sajtu. Da li ih cita iz sesije ili iz baze? Da li sesiju smesta u bazi? Dok pisem ovaj odgovor, elitesecurity kaze da je na sajtuy 82 registrovana korisnika i 530 gostiju - to je posecen sajt. Interval za posecenost im je 10 minuta. Bilo bi dobro dakazu da li pri svakom requestu stranice ili mozda drugacije.
Jos uvek pravim svoj sistem i evo sta planiram da uradim.
Znaci kako sam i rekao, citacu podatke iz sesija fajlova, posto mi se sesije ionako pri svakom requestu startuju pa cu tako izbeci jos upis u bazu.
E sada radi mesecne statistike koju mi je napomenuo 'dakipro', mora da se koristi baze. To cu napraviti tako sto cu svaki minut izvrsiti cronom jedan insert u bazu koji ce beleziti koliko je clanova online. Tada mi nece svaki korisnik updatovati bazu svaki minut, vec samo ovaj cron.
To resenje mi daje globalnu situaciju posecenosti sajta, ali ne mogu iz takve statistike pratiti ponasanje svakog pojedinacnog korisnika posebno. Takodje ne mogu izvlaciti podatke o pojedinacnim posecenostima svake stranice ponaosob... Mislim da cu ipak biti zadovoljan.
[ Man-Wolf @ 28.09.2009. 10:55 ] @
Aj da probam da se ukljucim u diskusiju
Elem, nisam 100% siguran, ali mislim da ES radi na sledecem principu:
Postoji baza koja belezi posete klijenata (odnosno njihove IP adrese). Pri svakoj 'akciji' (klik na neki link, komentarisanje slika,...) korisnika, u bazu se upise njegov IP i tacno vreme/datu. Lista aktivnih korisnika se vadi tako sto se iz baze selektuju svi redovi koji su mladji od 10 minuta. Postoji cron koji na svakih 10minuta brise sve adrese koje su neaktivne duze od 10minuta ... I to je cela logika. Ovakvo resenje se provlacilo 1000x kroz forum i mozda bi mogao da razmislis i o njemu
[ ColdKeyboard @ 28.09.2009. 12:08 ] @
A ovo je vrlo jednostavno i raspravljano o tome jedno milion puta.
Najjednostavniji nacin da se to uradi jeste da imas jednu tabelu sa korisnicima u kojoj cuvas osnovne podatke o korisniku (username, password/hash, email, lastactivity) ili da imas dvije tabele
od koji jedna sadrzi samo osnovne informacije o korisniku i link koji povezuje korisnika sa njegovim profilom u drugoj tabeli u kojoj cuvas profile korisnika.
Sve u svemu, poenta je da se ne opterecuje ni server ni baza sa suvisnim podacima.
Svaki put kada korisnik otvori neku stranicu, tj. kad posalje zahtjev za neku tvoju stranicu ti u svojoj bazi u njegovom profilu izmjenis njegov lastactivity.
Code: $query = mysql_query("update user_profiles set lastactivity='. time() .' where id = $user_id limit 1") or die(mysql_error));
Sada nema potrebe da se ti podaci cuvaju u posebnoj tabeli ili jos manje da se postavlja cron koji bi cistio tu tabelu...
Zar nije jednostavnije staviti da je aktivan user = posjetio sajt ili otvorio neku stranicu u posljednjih 10min i nakon toga samo izbrojati ili uzeti sva imena koja odgovaraju upitu.
Primer:
Code:
$active = time() - 60 * 10 //Znam da je ovo 600 :) ali ako neko bude imao potrebu da poveca limit, znaci stavlja se vrijednost u sekundama.
$query = mysql_query("select username from user_profiles where lastactivity <= '$active' order by lastactivity desc") or die(mysql_error());
$broj_online_korisnika = mysql_num_rows($query);
//lista korisnika koji su online
while($item = mysql_fetch_array($query))
{
$user_list .= $item['username'] .' ';
}
print "Users online: $broj_broj_online_korisnika <br />";
print "Korisnici koji su online: ";
print $user_list;
Vrlo jednostavno i stedi resurse. Moje misljenje je da nema potrebe za odvojenom tabelom i da se u njoj cuvaju podaci kada je ko pristupio sajti a jos manje
za cronjob-om koji bi cistio tu tabelu...
Nadam se da ce ovaj kod nekome biti od koristi.
Pozdrav,
Sale
[ zgas @ 01.10.2009. 08:23 ] @
Tvoje je resenje u redu ako neko ne zeli statistiku poseta u nekom vremenskom intervalu unazad.
Isto ako neko zeli da belezi ovo polje svaki put kada se pozove neka stranici a ne zeli da dira bazu zbog toga (jer se to ionako radi u sesijama),
kao sto je bilo reci o tome u ovoj temi, onda ovo resenje ne odgovara...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|